716 lines
20 KiB
C
716 lines
20 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (C) 1992-2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
MINIAFX.H
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MINIAFX.H
|
||
|
//
|
||
|
// MFC Subset declarations.
|
||
|
//
|
||
|
// CString, CWordArray, CDWordArray, CPtrArray, CStringArray, CPtrList
|
||
|
//
|
||
|
// 09/25/94 TSE
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef _MINIAFX_H_
|
||
|
#define _MINIAFX_H_
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
|
||
|
typedef void* POSITION; // abstract iteration position
|
||
|
|
||
|
#ifndef DWORD
|
||
|
typedef unsigned char BYTE; // 8-bit unsigned entity
|
||
|
typedef unsigned short WORD; // 16-bit unsigned number
|
||
|
typedef unsigned int UINT; // machine sized unsigned number (preferred)
|
||
|
typedef long LONG; // 32-bit signed number
|
||
|
typedef unsigned long DWORD; // 32-bit unsigned number
|
||
|
typedef int BOOL; // BOOLean (0 or !=0)
|
||
|
typedef char * LPSTR; // far pointer to a string
|
||
|
typedef const char * LPCSTR; // far pointer to a read-only string
|
||
|
#endif
|
||
|
|
||
|
#ifndef NULL
|
||
|
#define NULL 0
|
||
|
#endif
|
||
|
|
||
|
#ifndef TRUE
|
||
|
#define TRUE 1
|
||
|
#endif
|
||
|
|
||
|
#ifndef FALSE
|
||
|
#define FALSE 0
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CString
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// Constructors
|
||
|
CString();
|
||
|
CString(const CString& stringSrc);
|
||
|
CString(char ch, int nRepeat = 1);
|
||
|
CString(const char* psz);
|
||
|
CString(const char* pch, int nLength);
|
||
|
~CString();
|
||
|
|
||
|
// Attributes & Operations
|
||
|
|
||
|
// as an array of characters
|
||
|
int GetLength() const { return m_nDataLength; }
|
||
|
|
||
|
BOOL IsEmpty() const;
|
||
|
void Empty(); // free up the data
|
||
|
|
||
|
char GetAt(int nIndex) const; // 0 based
|
||
|
char operator[](int nIndex) const; // same as GetAt
|
||
|
void SetAt(int nIndex, char ch);
|
||
|
operator const char*() const // as a C string
|
||
|
{ return (const char*)m_pchData; }
|
||
|
|
||
|
// overloaded assignment
|
||
|
const CString& operator=(const CString& stringSrc);
|
||
|
const CString& operator=(char ch);
|
||
|
const CString& operator=(const char* psz);
|
||
|
|
||
|
// string concatenation
|
||
|
const CString& operator+=(const CString& string);
|
||
|
const CString& operator+=(char ch);
|
||
|
const CString& operator+=(const char* psz);
|
||
|
|
||
|
friend CString operator+(const CString& string1,
|
||
|
const CString& string2);
|
||
|
friend CString operator+(const CString& string, char ch);
|
||
|
friend CString operator+(char ch, const CString& string);
|
||
|
friend CString operator+(const CString& string, const char* psz);
|
||
|
friend CString operator+(const char* psz, const CString& string);
|
||
|
|
||
|
// string comparison
|
||
|
int Compare(const char* psz) const; // straight character
|
||
|
int CompareNoCase(const char* psz) const; // ignore case
|
||
|
int Collate(const char* psz) const; // NLS aware
|
||
|
|
||
|
// simple sub-string extraction
|
||
|
CString Mid(int nFirst, int nCount) const;
|
||
|
CString Mid(int nFirst) const;
|
||
|
CString Left(int nCount) const;
|
||
|
CString Right(int nCount) const;
|
||
|
|
||
|
CString SpanIncluding(const char* pszCharSet) const;
|
||
|
CString SpanExcluding(const char* pszCharSet) const;
|
||
|
|
||
|
// upper/lower/reverse conversion
|
||
|
void MakeUpper();
|
||
|
void MakeLower();
|
||
|
void MakeReverse();
|
||
|
|
||
|
// searching (return starting index, or -1 if not found)
|
||
|
// look for a single character match
|
||
|
int Find(char ch) const; // like "C" strchr
|
||
|
int ReverseFind(char ch) const;
|
||
|
int FindOneOf(const char* pszCharSet) const;
|
||
|
|
||
|
// look for a specific sub-string
|
||
|
int Find(const char* pszSub) const; // like "C" strstr
|
||
|
|
||
|
// Windows support
|
||
|
|
||
|
#ifdef _WINDOWS
|
||
|
BOOL LoadString(UINT nID); // load from string resource
|
||
|
// 255 chars max
|
||
|
// ANSI<->OEM support (convert string in place)
|
||
|
void AnsiToOem();
|
||
|
void OemToAnsi();
|
||
|
#endif //_WINDOWS
|
||
|
|
||
|
// Access to string implementation buffer as "C" character array
|
||
|
char* GetBuffer(int nMinBufLength);
|
||
|
void ReleaseBuffer(int nNewLength = -1);
|
||
|
char* GetBufferSetLength(int nNewLength);
|
||
|
|
||
|
// Implementation
|
||
|
public:
|
||
|
int GetAllocLength() const;
|
||
|
protected:
|
||
|
// lengths/sizes in characters
|
||
|
// (note: an extra character is always allocated)
|
||
|
char* m_pchData; // actual string (zero terminated)
|
||
|
int m_nDataLength; // does not include terminating 0
|
||
|
int m_nAllocLength; // does not include terminating 0
|
||
|
|
||
|
// implementation helpers
|
||
|
void Init();
|
||
|
void AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const;
|
||
|
void AllocBuffer(int nLen);
|
||
|
void AssignCopy(int nSrcLen, const char* pszSrcData);
|
||
|
void ConcatCopy(int nSrc1Len, const char* pszSrc1Data, int nSrc2Len, const char* pszSrc2Data);
|
||
|
void ConcatInPlace(int nSrcLen, const char* pszSrcData);
|
||
|
static void SafeDelete(char* pch);
|
||
|
static int SafeStrlen(const char* psz);
|
||
|
};
|
||
|
|
||
|
|
||
|
// Compare helpers
|
||
|
BOOL operator==(const CString& s1, const CString& s2);
|
||
|
BOOL operator==(const CString& s1, const char* s2);
|
||
|
BOOL operator==(const char* s1, const CString& s2);
|
||
|
BOOL operator!=(const CString& s1, const CString& s2);
|
||
|
BOOL operator!=(const CString& s1, const char* s2);
|
||
|
BOOL operator!=(const char* s1, const CString& s2);
|
||
|
BOOL operator<(const CString& s1, const CString& s2);
|
||
|
BOOL operator<(const CString& s1, const char* s2);
|
||
|
BOOL operator<(const char* s1, const CString& s2);
|
||
|
BOOL operator>(const CString& s1, const CString& s2);
|
||
|
BOOL operator>(const CString& s1, const char* s2);
|
||
|
BOOL operator>(const char* s1, const CString& s2);
|
||
|
BOOL operator<=(const CString& s1, const CString& s2);
|
||
|
BOOL operator<=(const CString& s1, const char* s2);
|
||
|
BOOL operator<=(const char* s1, const CString& s2);
|
||
|
BOOL operator>=(const CString& s1, const CString& s2);
|
||
|
BOOL operator>=(const CString& s1, const char* s2);
|
||
|
BOOL operator>=(const char* s1, const CString& s2);
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CDWordArray
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// Construction
|
||
|
CDWordArray();
|
||
|
|
||
|
// Attributes
|
||
|
int GetSize() const { return m_nSize; }
|
||
|
int GetUpperBound() const;
|
||
|
void SetSize(int nNewSize, int nGrowBy = -1);
|
||
|
|
||
|
// Operations
|
||
|
// Clean up
|
||
|
void FreeExtra();
|
||
|
void RemoveAll();
|
||
|
|
||
|
// Accessing elements
|
||
|
DWORD GetAt(int nIndex) const { return m_pData[nIndex]; }
|
||
|
|
||
|
void SetAt(int nIndex, DWORD newElement)
|
||
|
{ m_pData[nIndex] = newElement; }
|
||
|
|
||
|
DWORD& ElementAt(int nIndex);
|
||
|
|
||
|
// Potentially growing the array
|
||
|
void SetAtGrow(int nIndex, DWORD newElement);
|
||
|
int Add(DWORD newElement);
|
||
|
|
||
|
// overloaded operator helpers
|
||
|
DWORD operator[](int nIndex) const;
|
||
|
DWORD& operator[](int nIndex);
|
||
|
|
||
|
// Operations that move elements around
|
||
|
void InsertAt(int nIndex, DWORD newElement, int nCount = 1);
|
||
|
void RemoveAt(int nIndex, int nCount = 1);
|
||
|
void InsertAt(int nStartIndex, CDWordArray* pNewArray);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
DWORD* m_pData; // the actual array of data
|
||
|
int m_nSize; // # of elements (upperBound - 1)
|
||
|
int m_nMaxSize; // max allocated
|
||
|
int m_nGrowBy; // grow amount
|
||
|
|
||
|
public:
|
||
|
~CDWordArray();
|
||
|
};
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CPtrArray
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// Construction
|
||
|
CPtrArray();
|
||
|
|
||
|
// Attributes
|
||
|
int GetSize() const { return m_nSize; }
|
||
|
int GetUpperBound() const;
|
||
|
BOOL SetSize(int nNewSize, int nGrowBy = -1);
|
||
|
|
||
|
// Operations
|
||
|
// Clean up
|
||
|
void FreeExtra();
|
||
|
void RemoveAll();
|
||
|
|
||
|
// Accessing elements
|
||
|
void* GetAt(int nIndex) const { return m_pData[nIndex]; }
|
||
|
|
||
|
void SetAt(int nIndex, void* newElement)
|
||
|
{ m_pData[nIndex] = newElement; }
|
||
|
|
||
|
void*& ElementAt(int nIndex);
|
||
|
|
||
|
// Potentially growing the array
|
||
|
BOOL SetAtGrow(int nIndex, void* newElement);
|
||
|
|
||
|
// returns -1 if failure
|
||
|
|
||
|
int Add(void* newElement)
|
||
|
{ int nIndex = m_nSize;
|
||
|
if(SetAtGrow(nIndex, newElement))
|
||
|
return nIndex;
|
||
|
else
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// overloaded operator helpers
|
||
|
void* operator[](int nIndex) const;
|
||
|
void*& operator[](int nIndex);
|
||
|
|
||
|
// Operations that move elements around
|
||
|
void InsertAt(int nIndex, void* newElement, int nCount = 1);
|
||
|
void RemoveAt(int nIndex, int nCount = 1);
|
||
|
void InsertAt(int nStartIndex, CPtrArray* pNewArray);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
void** m_pData; // the actual array of data
|
||
|
int m_nSize; // # of elements (upperBound - 1)
|
||
|
int m_nMaxSize; // max allocated
|
||
|
int m_nGrowBy; // grow amount
|
||
|
|
||
|
public:
|
||
|
~CPtrArray();
|
||
|
};
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CStringArray
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
// Construction
|
||
|
CStringArray();
|
||
|
|
||
|
// Attributes
|
||
|
int GetSize() const { return m_nSize; }
|
||
|
int GetUpperBound() const;
|
||
|
void SetSize(int nNewSize, int nGrowBy = -1);
|
||
|
|
||
|
// Operations
|
||
|
// Clean up
|
||
|
void FreeExtra();
|
||
|
void RemoveAll();
|
||
|
|
||
|
|
||
|
// Accessing elements
|
||
|
CString GetAt(int nIndex) const { return m_pData[nIndex]; }
|
||
|
|
||
|
void SetAt(int nIndex, const char* newElement)
|
||
|
{ m_pData[nIndex] = newElement; }
|
||
|
|
||
|
CString& ElementAt(int nIndex)
|
||
|
{ return m_pData[nIndex]; }
|
||
|
|
||
|
// Potentially growing the array
|
||
|
void SetAtGrow(int nIndex, const char* newElement);
|
||
|
int Add(const char* newElement)
|
||
|
{ int nIndex = m_nSize;
|
||
|
SetAtGrow(nIndex, newElement);
|
||
|
return nIndex; }
|
||
|
|
||
|
// overloaded operator helpers
|
||
|
CString operator[](int nIndex) const
|
||
|
{ return GetAt(nIndex); }
|
||
|
|
||
|
CString& operator[](int nIndex)
|
||
|
{ return ElementAt(nIndex); }
|
||
|
|
||
|
// Operations that move elements around
|
||
|
void InsertAt(int nIndex, const char* newElement, int nCount = 1);
|
||
|
void RemoveAt(int nIndex, int nCount = 1);
|
||
|
void InsertAt(int nStartIndex, CStringArray* pNewArray);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
CString* m_pData; // the actual array of data
|
||
|
int m_nSize; // # of elements (upperBound - 1)
|
||
|
int m_nMaxSize; // max allocated
|
||
|
int m_nGrowBy; // grow amount
|
||
|
|
||
|
public:
|
||
|
~CStringArray();
|
||
|
};
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CWordArray
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// Construction
|
||
|
CWordArray();
|
||
|
|
||
|
// Attributes
|
||
|
int GetSize() const { return m_nSize; }
|
||
|
int GetUpperBound() const;
|
||
|
void SetSize(int nNewSize, int nGrowBy = -1);
|
||
|
|
||
|
// Operations
|
||
|
// Clean up
|
||
|
void FreeExtra();
|
||
|
void RemoveAll();
|
||
|
|
||
|
// Accessing elements
|
||
|
WORD GetAt(int nIndex) const { return m_pData[nIndex]; }
|
||
|
void SetAt(int nIndex, WORD newElement)
|
||
|
{ m_pData[nIndex] = newElement; }
|
||
|
WORD& ElementAt(int nIndex);
|
||
|
|
||
|
// Potentially growing the array
|
||
|
void SetAtGrow(int nIndex, WORD newElement);
|
||
|
int Add(WORD newElement);
|
||
|
|
||
|
// overloaded operator helpers
|
||
|
WORD operator[](int nIndex) const;
|
||
|
WORD& operator[](int nIndex);
|
||
|
|
||
|
// Operations that move elements around
|
||
|
void InsertAt(int nIndex, WORD newElement, int nCount = 1);
|
||
|
void RemoveAt(int nIndex, int nCount = 1);
|
||
|
void InsertAt(int nStartIndex, CWordArray* pNewArray);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
WORD* m_pData; // the actual array of data
|
||
|
int m_nSize; // # of elements (upperBound - 1)
|
||
|
int m_nMaxSize; // max allocated
|
||
|
int m_nGrowBy; // grow amount
|
||
|
|
||
|
public:
|
||
|
~CWordArray();
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
class CPtrList
|
||
|
{
|
||
|
protected:
|
||
|
struct CNode
|
||
|
{
|
||
|
CNode* pNext;
|
||
|
CNode* pPrev;
|
||
|
void* data;
|
||
|
};
|
||
|
public:
|
||
|
|
||
|
// Construction
|
||
|
CPtrList(int nBlockSize=10);
|
||
|
|
||
|
// Attributes (head and tail)
|
||
|
// count of elements
|
||
|
int GetCount() const;
|
||
|
BOOL IsEmpty() const;
|
||
|
|
||
|
// peek at head or tail
|
||
|
void*& GetHead();
|
||
|
void* GetHead() const;
|
||
|
void*& GetTail();
|
||
|
void* GetTail() const;
|
||
|
|
||
|
// Operations
|
||
|
// get head or tail (and remove it) - don't call on empty list !
|
||
|
void* RemoveHead();
|
||
|
void* RemoveTail();
|
||
|
|
||
|
// add before head or after tail
|
||
|
POSITION AddHead(void* newElement);
|
||
|
POSITION AddTail(void* newElement);
|
||
|
|
||
|
// add another list of elements before head or after tail
|
||
|
void AddHead(CPtrList* pNewList);
|
||
|
void AddTail(CPtrList* pNewList);
|
||
|
|
||
|
// remove all elements
|
||
|
void RemoveAll();
|
||
|
|
||
|
// iteration
|
||
|
POSITION GetHeadPosition() const;
|
||
|
POSITION GetTailPosition() const;
|
||
|
void*& GetNext(POSITION& rPosition); // return *Position++
|
||
|
void* GetNext(POSITION& rPosition) const; // return *Position++
|
||
|
void*& GetPrev(POSITION& rPosition); // return *Position--
|
||
|
void* GetPrev(POSITION& rPosition) const; // return *Position--
|
||
|
|
||
|
// getting/modifying an element at a given position
|
||
|
void*& GetAt(POSITION position);
|
||
|
void* GetAt(POSITION position) const;
|
||
|
void SetAt(POSITION pos, void* newElement);
|
||
|
void RemoveAt(POSITION position);
|
||
|
|
||
|
// inserting before or after a given position
|
||
|
POSITION InsertBefore(POSITION position, void* newElement);
|
||
|
POSITION InsertAfter(POSITION position, void* newElement);
|
||
|
|
||
|
// helper functions (note: O(n) speed)
|
||
|
POSITION Find(void* searchValue, POSITION startAfter = NULL) const;
|
||
|
// defaults to starting at the HEAD
|
||
|
// return NULL if not found
|
||
|
POSITION FindIndex(int nIndex) const;
|
||
|
// get the 'nIndex'th element (may return NULL)
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
CNode* m_pNodeHead;
|
||
|
CNode* m_pNodeTail;
|
||
|
int m_nCount;
|
||
|
CNode* m_pNodeFree;
|
||
|
struct CPlex* m_pBlocks;
|
||
|
int m_nBlockSize;
|
||
|
|
||
|
CNode* NewNode(CNode*, CNode*);
|
||
|
void FreeNode(CNode*);
|
||
|
|
||
|
public:
|
||
|
~CPtrList();
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
// Inlines from AFX.INL and AFXCOLL.INL
|
||
|
//
|
||
|
|
||
|
#define _AFX_INLINE inline
|
||
|
#define _AFXCOLL_INLINE inline
|
||
|
|
||
|
// CString
|
||
|
|
||
|
_AFX_INLINE int CString::GetAllocLength() const
|
||
|
{ return m_nAllocLength; }
|
||
|
_AFX_INLINE BOOL CString::IsEmpty() const
|
||
|
{ return m_nDataLength == 0; }
|
||
|
//_AFX_INLINE int CString::SafeStrlen(const char* psz)
|
||
|
// { return (psz == NULL) ? NULL : strlen(psz); }
|
||
|
|
||
|
#ifndef _WINDOWS
|
||
|
_AFX_INLINE int CString::Compare(const char* psz) const
|
||
|
{ return strcmp(m_pchData, psz); }
|
||
|
_AFX_INLINE int CString::CompareNoCase(const char* psz) const
|
||
|
{ return stricmp(m_pchData, psz); }
|
||
|
_AFX_INLINE int CString::Collate(const char* psz) const
|
||
|
{ return strcoll(m_pchData, psz); }
|
||
|
_AFX_INLINE void CString::MakeUpper()
|
||
|
{ strupr(m_pchData); }
|
||
|
_AFX_INLINE void CString::MakeLower()
|
||
|
{ strlwr(m_pchData); }
|
||
|
// Windows version in AFXWIN.H
|
||
|
#endif //!_WINDOWS
|
||
|
|
||
|
_AFX_INLINE void CString::MakeReverse()
|
||
|
{ strrev(m_pchData); }
|
||
|
_AFX_INLINE char CString::GetAt(int nIndex) const
|
||
|
{
|
||
|
return m_pchData[nIndex];
|
||
|
}
|
||
|
_AFX_INLINE char CString::operator[](int nIndex) const
|
||
|
{
|
||
|
return m_pchData[nIndex];
|
||
|
}
|
||
|
_AFX_INLINE void CString::SetAt(int nIndex, char ch)
|
||
|
{
|
||
|
m_pchData[nIndex] = ch;
|
||
|
}
|
||
|
|
||
|
_AFX_INLINE BOOL operator==(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) == 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator==(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) == 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator==(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) == 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator!=(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) != 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator!=(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) != 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator!=(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) != 0; }
|
||
|
|
||
|
_AFX_INLINE BOOL operator<(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) < 0; }
|
||
|
_AFX_INLINE BOOL operator<(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) < 0; }
|
||
|
_AFX_INLINE BOOL operator<(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) > 0; }
|
||
|
_AFX_INLINE BOOL operator>(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) > 0; }
|
||
|
_AFX_INLINE BOOL operator>(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) > 0; }
|
||
|
_AFX_INLINE BOOL operator>(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) < 0; }
|
||
|
_AFX_INLINE BOOL operator<=(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) <= 0; }
|
||
|
_AFX_INLINE BOOL operator<=(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) <= 0; }
|
||
|
_AFX_INLINE BOOL operator<=(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) >= 0; }
|
||
|
_AFX_INLINE BOOL operator>=(const CString& s1, const CString& s2)
|
||
|
{ return s1.Compare(s2) >= 0; }
|
||
|
_AFX_INLINE BOOL operator>=(const CString& s1, const char* s2)
|
||
|
{ return s1.Compare(s2) >= 0; }
|
||
|
_AFX_INLINE BOOL operator>=(const char* s1, const CString& s2)
|
||
|
{ return s2.Compare(s1) <= 0; }
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
_AFXCOLL_INLINE int CWordArray::GetUpperBound() const
|
||
|
{ return m_nSize-1; }
|
||
|
_AFXCOLL_INLINE void CWordArray::RemoveAll()
|
||
|
{ SetSize(0); }
|
||
|
_AFXCOLL_INLINE WORD& CWordArray::ElementAt(int nIndex)
|
||
|
{ return m_pData[nIndex]; }
|
||
|
_AFXCOLL_INLINE int CWordArray::Add(WORD newElement)
|
||
|
{ int nIndex = m_nSize;
|
||
|
SetAtGrow(nIndex, newElement);
|
||
|
return nIndex; }
|
||
|
_AFXCOLL_INLINE WORD CWordArray::operator[](int nIndex) const
|
||
|
{ return GetAt(nIndex); }
|
||
|
_AFXCOLL_INLINE WORD& CWordArray::operator[](int nIndex)
|
||
|
{ return ElementAt(nIndex); }
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
_AFXCOLL_INLINE int CDWordArray::GetUpperBound() const
|
||
|
{ return m_nSize-1; }
|
||
|
_AFXCOLL_INLINE void CDWordArray::RemoveAll()
|
||
|
{ SetSize(0); }
|
||
|
_AFXCOLL_INLINE DWORD& CDWordArray::ElementAt(int nIndex)
|
||
|
{ return m_pData[nIndex]; }
|
||
|
_AFXCOLL_INLINE int CDWordArray::Add(DWORD newElement)
|
||
|
{ int nIndex = m_nSize;
|
||
|
SetAtGrow(nIndex, newElement);
|
||
|
return nIndex; }
|
||
|
_AFXCOLL_INLINE DWORD CDWordArray::operator[](int nIndex) const
|
||
|
{ return GetAt(nIndex); }
|
||
|
_AFXCOLL_INLINE DWORD& CDWordArray::operator[](int nIndex)
|
||
|
{ return ElementAt(nIndex); }
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
_AFXCOLL_INLINE int CPtrArray::GetUpperBound() const
|
||
|
{ return m_nSize-1; }
|
||
|
_AFXCOLL_INLINE void CPtrArray::RemoveAll()
|
||
|
{ SetSize(0); }
|
||
|
_AFXCOLL_INLINE void*& CPtrArray::ElementAt(int nIndex)
|
||
|
{ return m_pData[nIndex]; }
|
||
|
_AFXCOLL_INLINE void* CPtrArray::operator[](int nIndex) const
|
||
|
{ return GetAt(nIndex); }
|
||
|
_AFXCOLL_INLINE void*& CPtrArray::operator[](int nIndex)
|
||
|
{ return ElementAt(nIndex); }
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
_AFXCOLL_INLINE int CStringArray::GetUpperBound() const
|
||
|
{ return m_nSize-1; }
|
||
|
_AFXCOLL_INLINE void CStringArray::RemoveAll()
|
||
|
{ SetSize(0); }
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
_AFXCOLL_INLINE int CPtrList::GetCount() const
|
||
|
{ return m_nCount; }
|
||
|
_AFXCOLL_INLINE BOOL CPtrList::IsEmpty() const
|
||
|
{ return m_nCount == 0; }
|
||
|
_AFXCOLL_INLINE void*& CPtrList::GetHead()
|
||
|
{ return m_pNodeHead->data; }
|
||
|
_AFXCOLL_INLINE void* CPtrList::GetHead() const
|
||
|
{ return m_pNodeHead->data; }
|
||
|
_AFXCOLL_INLINE void*& CPtrList::GetTail()
|
||
|
{ return m_pNodeTail->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void* CPtrList::GetTail() const
|
||
|
{ return m_pNodeTail->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE POSITION CPtrList::GetHeadPosition() const
|
||
|
{ return (POSITION) m_pNodeHead; }
|
||
|
|
||
|
_AFXCOLL_INLINE POSITION CPtrList::GetTailPosition() const
|
||
|
{ return (POSITION) m_pNodeTail; }
|
||
|
|
||
|
_AFXCOLL_INLINE void*& CPtrList::GetNext(POSITION& rPosition) // return *Position++
|
||
|
{ CNode* pNode = (CNode*) rPosition;
|
||
|
rPosition = (POSITION) pNode->pNext;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void* CPtrList::GetNext(POSITION& rPosition) const // return *Position++
|
||
|
{ CNode* pNode = (CNode*) rPosition;
|
||
|
rPosition = (POSITION) pNode->pNext;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void*& CPtrList::GetPrev(POSITION& rPosition) // return *Position--
|
||
|
{ CNode* pNode = (CNode*) rPosition;
|
||
|
rPosition = (POSITION) pNode->pPrev;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void* CPtrList::GetPrev(POSITION& rPosition) const // return *Position--
|
||
|
{ CNode* pNode = (CNode*) rPosition;
|
||
|
rPosition = (POSITION) pNode->pPrev;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void*& CPtrList::GetAt(POSITION position)
|
||
|
{ CNode* pNode = (CNode*) position;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void* CPtrList::GetAt(POSITION position) const
|
||
|
{ CNode* pNode = (CNode*) position;
|
||
|
return pNode->data; }
|
||
|
|
||
|
_AFXCOLL_INLINE void CPtrList::SetAt(POSITION pos, void* newElement)
|
||
|
{ CNode* pNode = (CNode*) pos;
|
||
|
pNode->data = newElement; }
|
||
|
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
#endif
|