1998-09-04 23:04:30 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
1998-09-04 23:04:30 +04:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
1998-09-04 23:04:30 +04:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape
|
1998-09-04 23:04:30 +04:00
|
|
|
* Communications Corporation. Portions created by Netscape are
|
1999-11-06 06:43:54 +03:00
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
1998-09-04 23:04:30 +04:00
|
|
|
*/
|
|
|
|
// ptrarray.h
|
|
|
|
#ifndef PTR_ARRAY_H_
|
|
|
|
#define PTR_ARRAY_H_
|
|
|
|
|
|
|
|
#ifdef XP_UNIX
|
|
|
|
#define __cdecl
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef int XPCompareFunc(const void *, const void *);
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
// These are here to stop people calling
|
|
|
|
#define VIRTUAL virtual
|
|
|
|
#else
|
|
|
|
#define VIRTUAL
|
|
|
|
#endif // DEBUG
|
|
|
|
|
|
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
class XPPtrArray
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Construction/destruction
|
|
|
|
XPPtrArray();
|
|
|
|
virtual ~XPPtrArray();
|
|
|
|
|
|
|
|
// State/attribute member functions
|
|
|
|
int GetSize() const;
|
|
|
|
XP_Bool IsValidIndex(int32 nIndex);
|
|
|
|
VIRTUAL XP_Bool SetSize(int nNewSize);
|
|
|
|
|
|
|
|
// Accessor member functions
|
|
|
|
void *&ElementAt(int nIndex);
|
|
|
|
virtual int FindIndex (int nStartIndex, void *pToFind) const;
|
|
|
|
virtual int FindIndexUsing(int nStartIndex, void *pToFind, XPCompareFunc* compare) const;
|
|
|
|
void *GetAt(int nIndex) const;
|
|
|
|
VIRTUAL void SetAt(int nIndex, void *newElement);
|
|
|
|
|
|
|
|
// Insertion/deletion member functions
|
|
|
|
virtual int Add(void *newElement);
|
|
|
|
VIRTUAL void InsertAt(int nIndex, void *newElement, int nCount = 1);
|
|
|
|
VIRTUAL void InsertAt(int nStartIndex, const XPPtrArray *pNewArray);
|
|
|
|
XP_Bool Remove(void *pToRemove);
|
|
|
|
virtual void RemoveAll();
|
|
|
|
void RemoveAt(int nIndex, int nCount = 1);
|
|
|
|
void RemoveAt(int nStartIndex, const XPPtrArray *pNewArray);
|
|
|
|
VIRTUAL void SetAtGrow(int nIndex, void *newElement);
|
|
|
|
|
|
|
|
// Sorting member functions
|
|
|
|
int InsertBinary(void *newElement, XPCompareFunc *compare);
|
|
|
|
void QuickSort(XPCompareFunc *compare);
|
|
|
|
|
|
|
|
// Overloaded operators
|
|
|
|
void *operator[](int nIndex) const;
|
|
|
|
void *&operator[](int nIndex);
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
virtual XP_Bool VerifySort() const;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// Member Variables
|
|
|
|
int m_nSize;
|
|
|
|
int m_nMaxSize;
|
|
|
|
void **m_pData;
|
|
|
|
};
|
|
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
class XPSortedPtrArray : public XPPtrArray
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
XPSortedPtrArray(XPCompareFunc *compare);
|
|
|
|
|
|
|
|
virtual int Add(void *newElement);
|
|
|
|
|
|
|
|
// PROMISE: this class will always call the compare-func with pToFind as the
|
|
|
|
// second parameter.
|
|
|
|
virtual int FindIndex(int nStartIndex, void *pToFind) const;
|
|
|
|
|
|
|
|
// These functions can only be used on non-sorted PtrArray objects (i.e. compareFunc is NULL)
|
|
|
|
virtual void SetAt(int nIndex, void* newElement);
|
|
|
|
virtual void InsertAt(int nIndex, void* newElement, int nCount = 1);
|
|
|
|
virtual void InsertAt(int nStartIndex, const XPPtrArray* pNewArray);
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
virtual XP_Bool VerifySort() const;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// Allows search to use a different compare func from the sort. This is used
|
|
|
|
// by MSG_FolderCache, to find the cache element corresponding to a folder.
|
|
|
|
// The corresponding element and folder have identical relative paths, and the
|
|
|
|
// relative path is used by both compare funcs, which is why it works.
|
|
|
|
// to the found element
|
|
|
|
int FindIndexUsing(int nStartIndex, void *pToFind,
|
|
|
|
XPCompareFunc *compare) const;
|
|
|
|
|
|
|
|
// Member Variables
|
|
|
|
XPCompareFunc* m_CompareFunc; // NULL to simulate unsorted base-class.
|
|
|
|
};
|
|
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
// msg_StringArray is a subclass of the generic pointer array class
|
|
|
|
// which is intended for string operations.
|
|
|
|
// - It can "own" the strings, or not.
|
|
|
|
// - It can be sorted, if you provide a CompareFunc, or not, if you don't
|
|
|
|
|
|
|
|
class msg_StringArray : public XPSortedPtrArray
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Overrides from base class
|
|
|
|
msg_StringArray (XP_Bool ownsMemory, XPCompareFunc *compare = NULL);
|
|
|
|
virtual ~msg_StringArray ();
|
|
|
|
|
|
|
|
const char *GetAt (int i) const { return (const char*) XPPtrArray::GetAt(i); }
|
|
|
|
virtual int Add (void *string);
|
|
|
|
virtual void RemoveAll ();
|
|
|
|
|
|
|
|
XP_Bool ImportTokenList (const char *list, const char *tokenSeps = ", ");
|
|
|
|
char *ExportTokenList (const char *tokenSep = ", ");
|
|
|
|
|
|
|
|
protected:
|
|
|
|
XP_Bool m_ownsMemory;
|
|
|
|
};
|
|
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
|
|
|
|
class MSG_FolderInfo;
|
|
|
|
|
|
|
|
class MSG_FolderArray : public XPSortedPtrArray
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Override constructor to allow folderArrays to be sorted
|
|
|
|
MSG_FolderArray (XPCompareFunc *compare = NULL) : XPSortedPtrArray (compare) {}
|
|
|
|
|
|
|
|
// Encapsulate this typecast, so we don't have to do it all over the place.
|
|
|
|
MSG_FolderInfo *GetAt(int i) const { return (MSG_FolderInfo*) XPPtrArray::GetAt(i); }
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|