Annotation of mstools/mfc/include/afxcoll.h, revision 1.1.1.1

1.1       root        1: // Microsoft Foundation Classes C++ library. 
                      2: // Copyright (C) 1992 Microsoft Corporation, 
                      3: // All rights reserved. 
                      4: 
                      5: // This source code is only intended as a supplement to the 
                      6: // Microsoft Foundation Classes Reference and Microsoft 
                      7: // QuickHelp documentation provided with the library. 
                      8: // See these sources for detailed information regarding the 
                      9: // Microsoft Foundation Classes product. 
                     10: 
                     11: 
                     12: #ifndef __AFXCOLL_H__
                     13: #define __AFXCOLL_H__
                     14: 
                     15: #ifndef __AFX_H__
                     16: #include "afx.h"
                     17: #endif
                     18: 
                     19: /////////////////////////////////////////////////////////////////////////////
                     20: // Classes declared in this file
                     21: 
                     22: //CObject
                     23:        // Arrays
                     24:        class CByteArray;           // array of BYTE
                     25:        class CWordArray;           // array of WORD
                     26:        class CDWordArray;          // array of DWORD
                     27:        class CPtrArray;            // array of void*
                     28:        class CObArray;             // array of CObject*
                     29: 
                     30:        // Lists
                     31:        class CPtrList;             // list of void*
                     32:        class CObList;              // list of CObject*
                     33: 
                     34:        // Maps (aka Dictionaries)
                     35:        class CMapWordToOb;         // map from WORD to CObject*
                     36:        class CMapWordToPtr;        // map from WORD to void*
                     37:        class CMapPtrToWord;        // map from void* to WORD
                     38:        class CMapPtrToPtr;         // map from void* to void*
                     39: 
                     40:        // Special String variants
                     41:        class CStringArray;         // array of CStrings
                     42:        class CStringList;          // list of CStrings
                     43:        class CMapStringToPtr;      // map from CString to void*
                     44:        class CMapStringToOb;       // map from CString to CObject*
                     45:        class CMapStringToString;   // map from CString to CString
                     46: 
                     47: /////////////////////////////////////////////////////////////////////////////
                     48: 
                     49: #ifdef _DEBUG
                     50: extern char BASED_CODE _afxSzAfxColl[]; // defined in dumpcont.cpp
                     51: #undef THIS_FILE
                     52: #define THIS_FILE _afxSzAfxColl
                     53: #endif
                     54: 
                     55: 
                     56: ////////////////////////////////////////////////////////////////////////////
                     57: 
                     58: 
                     59: class CByteArray : public CObject
                     60: {
                     61: 
                     62:        DECLARE_SERIAL(CByteArray)
                     63: public:
                     64: 
                     65: // Construction
                     66:        CByteArray();
                     67: 
                     68: // Attributes
                     69:        int     GetSize() const
                     70:                                { return m_nSize; }
                     71:        int     GetUpperBound() const
                     72:                                { return m_nSize-1; }
                     73:        void    SetSize(int nNewSize, int nGrowBy = -1);
                     74: 
                     75: // Operations
                     76:        // Clean up
                     77:        void    FreeExtra();
                     78:        void    RemoveAll()
                     79:                                { SetSize(0); }
                     80: 
                     81:        // Accessing elements
                     82:        BYTE    GetAt(int nIndex) const
                     83:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                     84:                                        return m_pData[nIndex]; }
                     85:        void    SetAt(int nIndex, BYTE newElement)
                     86:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                     87:                                        m_pData[nIndex] = newElement; }
                     88:        BYTE&   ElementAt(int nIndex)
                     89:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                     90:                                        return m_pData[nIndex]; }
                     91: 
                     92:        // Potentially growing the array
                     93:        void    SetAtGrow(int nIndex, BYTE newElement);
                     94:        int     Add(BYTE newElement)
                     95:                                { int nIndex = m_nSize;
                     96:                                        SetAtGrow(nIndex, newElement);
                     97:                                        return nIndex; }
                     98: 
                     99:        // overloaded operator helpers
                    100:        BYTE    operator[](int nIndex) const
                    101:                                { return GetAt(nIndex); }
                    102:        BYTE&   operator[](int nIndex)
                    103:                                { return ElementAt(nIndex); }
                    104: 
                    105:        // Operations that move elements around
                    106:        void    InsertAt(int nIndex, BYTE newElement, int nCount = 1);
                    107:        void    RemoveAt(int nIndex, int nCount = 1);
                    108:        void    InsertAt(int nStartIndex, CByteArray* pNewArray);
                    109: 
                    110: // Implementation
                    111: protected:
                    112:        BYTE*   m_pData;        // the actual array of data
                    113:        int     m_nSize;        // # of elements (upperBound - 1)
                    114:        int     m_nMaxSize;     // max allocated
                    115:        int     m_nGrowBy;      // grow amount
                    116: 
                    117: public:
                    118:        ~CByteArray();
                    119: 
                    120:        void    Serialize(CArchive&);
                    121: #ifdef _DEBUG
                    122:        void    Dump(CDumpContext&) const;
                    123:        void    AssertValid() const;
                    124: #endif
                    125: };
                    126: 
                    127: 
                    128: 
                    129: ////////////////////////////////////////////////////////////////////////////
                    130: 
                    131: 
                    132: class CWordArray : public CObject
                    133: {
                    134: 
                    135:        DECLARE_SERIAL(CWordArray)
                    136: public:
                    137: 
                    138: // Construction
                    139:        CWordArray();
                    140: 
                    141: // Attributes
                    142:        int     GetSize() const
                    143:                                { return m_nSize; }
                    144:        int     GetUpperBound() const
                    145:                                { return m_nSize-1; }
                    146:        void    SetSize(int nNewSize, int nGrowBy = -1);
                    147: 
                    148: // Operations
                    149:        // Clean up
                    150:        void    FreeExtra();
                    151:        void    RemoveAll()
                    152:                                { SetSize(0); }
                    153: 
                    154:        // Accessing elements
                    155:        WORD    GetAt(int nIndex) const
                    156:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    157:                                        return m_pData[nIndex]; }
                    158:        void    SetAt(int nIndex, WORD newElement)
                    159:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    160:                                        m_pData[nIndex] = newElement; }
                    161:        WORD&   ElementAt(int nIndex)
                    162:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    163:                                        return m_pData[nIndex]; }
                    164: 
                    165:        // Potentially growing the array
                    166:        void    SetAtGrow(int nIndex, WORD newElement);
                    167:        int     Add(WORD newElement)
                    168:                                { int nIndex = m_nSize;
                    169:                                        SetAtGrow(nIndex, newElement);
                    170:                                        return nIndex; }
                    171: 
                    172:        // overloaded operator helpers
                    173:        WORD    operator[](int nIndex) const
                    174:                                { return GetAt(nIndex); }
                    175:        WORD&   operator[](int nIndex)
                    176:                                { return ElementAt(nIndex); }
                    177: 
                    178:        // Operations that move elements around
                    179:        void    InsertAt(int nIndex, WORD newElement, int nCount = 1);
                    180:        void    RemoveAt(int nIndex, int nCount = 1);
                    181:        void    InsertAt(int nStartIndex, CWordArray* pNewArray);
                    182: 
                    183: // Implementation
                    184: protected:
                    185:        WORD*   m_pData;        // the actual array of data
                    186:        int     m_nSize;        // # of elements (upperBound - 1)
                    187:        int     m_nMaxSize;     // max allocated
                    188:        int     m_nGrowBy;      // grow amount
                    189: 
                    190: public:
                    191:        ~CWordArray();
                    192: 
                    193:        void    Serialize(CArchive&);
                    194: #ifdef _DEBUG
                    195:        void    Dump(CDumpContext&) const;
                    196:        void    AssertValid() const;
                    197: #endif
                    198: };
                    199: 
                    200: 
                    201: 
                    202: ////////////////////////////////////////////////////////////////////////////
                    203: 
                    204: 
                    205: class CDWordArray : public CObject
                    206: {
                    207: 
                    208:        DECLARE_SERIAL(CDWordArray)
                    209: public:
                    210: 
                    211: // Construction
                    212:        CDWordArray();
                    213: 
                    214: // Attributes
                    215:        int     GetSize() const
                    216:                                { return m_nSize; }
                    217:        int     GetUpperBound() const
                    218:                                { return m_nSize-1; }
                    219:        void    SetSize(int nNewSize, int nGrowBy = -1);
                    220: 
                    221: // Operations
                    222:        // Clean up
                    223:        void    FreeExtra();
                    224:        void    RemoveAll()
                    225:                                { SetSize(0); }
                    226: 
                    227:        // Accessing elements
                    228:        DWORD    GetAt(int nIndex) const
                    229:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    230:                                        return m_pData[nIndex]; }
                    231:        void    SetAt(int nIndex, DWORD newElement)
                    232:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    233:                                        m_pData[nIndex] = newElement; }
                    234:        DWORD&   ElementAt(int nIndex)
                    235:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    236:                                        return m_pData[nIndex]; }
                    237: 
                    238:        // Potentially growing the array
                    239:        void    SetAtGrow(int nIndex, DWORD newElement);
                    240:        int     Add(DWORD newElement)
                    241:                                { int nIndex = m_nSize;
                    242:                                        SetAtGrow(nIndex, newElement);
                    243:                                        return nIndex; }
                    244: 
                    245:        // overloaded operator helpers
                    246:        DWORD    operator[](int nIndex) const
                    247:                                { return GetAt(nIndex); }
                    248:        DWORD&   operator[](int nIndex)
                    249:                                { return ElementAt(nIndex); }
                    250: 
                    251:        // Operations that move elements around
                    252:        void    InsertAt(int nIndex, DWORD newElement, int nCount = 1);
                    253:        void    RemoveAt(int nIndex, int nCount = 1);
                    254:        void    InsertAt(int nStartIndex, CDWordArray* pNewArray);
                    255: 
                    256: // Implementation
                    257: protected:
                    258:        DWORD*   m_pData;        // the actual array of data
                    259:        int     m_nSize;        // # of elements (upperBound - 1)
                    260:        int     m_nMaxSize;     // max allocated
                    261:        int     m_nGrowBy;      // grow amount
                    262: 
                    263: public:
                    264:        ~CDWordArray();
                    265: 
                    266:        void    Serialize(CArchive&);
                    267: #ifdef _DEBUG
                    268:        void    Dump(CDumpContext&) const;
                    269:        void    AssertValid() const;
                    270: #endif
                    271: };
                    272: 
                    273: 
                    274: 
                    275: ////////////////////////////////////////////////////////////////////////////
                    276: 
                    277: 
                    278: class CPtrArray : public CObject
                    279: {
                    280: 
                    281:        DECLARE_DYNAMIC(CPtrArray)
                    282: public:
                    283: 
                    284: // Construction
                    285:        CPtrArray();
                    286: 
                    287: // Attributes
                    288:        int     GetSize() const
                    289:                                { return m_nSize; }
                    290:        int     GetUpperBound() const
                    291:                                { return m_nSize-1; }
                    292:        void    SetSize(int nNewSize, int nGrowBy = -1);
                    293: 
                    294: // Operations
                    295:        // Clean up
                    296:        void    FreeExtra();
                    297:        void    RemoveAll()
                    298:                                { SetSize(0); }
                    299: 
                    300:        // Accessing elements
                    301:        void*    GetAt(int nIndex) const
                    302:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    303:                                        return m_pData[nIndex]; }
                    304:        void    SetAt(int nIndex, void* newElement)
                    305:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    306:                                        m_pData[nIndex] = newElement; }
                    307:        void*&   ElementAt(int nIndex)
                    308:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    309:                                        return m_pData[nIndex]; }
                    310: 
                    311:        // Potentially growing the array
                    312:        void    SetAtGrow(int nIndex, void* newElement);
                    313:        int     Add(void* newElement)
                    314:                                { int nIndex = m_nSize;
                    315:                                        SetAtGrow(nIndex, newElement);
                    316:                                        return nIndex; }
                    317: 
                    318:        // overloaded operator helpers
                    319:        void*    operator[](int nIndex) const
                    320:                                { return GetAt(nIndex); }
                    321:        void*&   operator[](int nIndex)
                    322:                                { return ElementAt(nIndex); }
                    323: 
                    324:        // Operations that move elements around
                    325:        void    InsertAt(int nIndex, void* newElement, int nCount = 1);
                    326:        void    RemoveAt(int nIndex, int nCount = 1);
                    327:        void    InsertAt(int nStartIndex, CPtrArray* pNewArray);
                    328: 
                    329: // Implementation
                    330: protected:
                    331:        void**   m_pData;        // the actual array of data
                    332:        int     m_nSize;        // # of elements (upperBound - 1)
                    333:        int     m_nMaxSize;     // max allocated
                    334:        int     m_nGrowBy;      // grow amount
                    335: 
                    336: public:
                    337:        ~CPtrArray();
                    338: #ifdef _DEBUG
                    339:        void    Dump(CDumpContext&) const;
                    340:        void    AssertValid() const;
                    341: #endif
                    342: };
                    343: 
                    344: 
                    345: 
                    346: ////////////////////////////////////////////////////////////////////////////
                    347: 
                    348: 
                    349: class CObArray : public CObject
                    350: {
                    351: 
                    352:        DECLARE_SERIAL(CObArray)
                    353: public:
                    354: 
                    355: // Construction
                    356:        CObArray();
                    357: 
                    358: // Attributes
                    359:        int     GetSize() const
                    360:                                { return m_nSize; }
                    361:        int     GetUpperBound() const
                    362:                                { return m_nSize-1; }
                    363:        void    SetSize(int nNewSize, int nGrowBy = -1);
                    364: 
                    365: // Operations
                    366:        // Clean up
                    367:        void    FreeExtra();
                    368:        void    RemoveAll()
                    369:                                { SetSize(0); }
                    370: 
                    371:        // Accessing elements
                    372:        CObject*    GetAt(int nIndex) const
                    373:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    374:                                        return m_pData[nIndex]; }
                    375:        void    SetAt(int nIndex, CObject* newElement)
                    376:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    377:                                        m_pData[nIndex] = newElement; }
                    378:        CObject*&   ElementAt(int nIndex)
                    379:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    380:                                        return m_pData[nIndex]; }
                    381: 
                    382:        // Potentially growing the array
                    383:        void    SetAtGrow(int nIndex, CObject* newElement);
                    384:        int     Add(CObject* newElement)
                    385:                                { int nIndex = m_nSize;
                    386:                                        SetAtGrow(nIndex, newElement);
                    387:                                        return nIndex; }
                    388: 
                    389:        // overloaded operator helpers
                    390:        CObject*    operator[](int nIndex) const
                    391:                                { return GetAt(nIndex); }
                    392:        CObject*&   operator[](int nIndex)
                    393:                                { return ElementAt(nIndex); }
                    394: 
                    395:        // Operations that move elements around
                    396:        void    InsertAt(int nIndex, CObject* newElement, int nCount = 1);
                    397:        void    RemoveAt(int nIndex, int nCount = 1);
                    398:        void    InsertAt(int nStartIndex, CObArray* pNewArray);
                    399: 
                    400: // Implementation
                    401: protected:
                    402:        CObject**   m_pData;        // the actual array of data
                    403:        int     m_nSize;        // # of elements (upperBound - 1)
                    404:        int     m_nMaxSize;     // max allocated
                    405:        int     m_nGrowBy;      // grow amount
                    406: 
                    407: public:
                    408:        ~CObArray();
                    409: 
                    410:        void    Serialize(CArchive&);
                    411: #ifdef _DEBUG
                    412:        void    Dump(CDumpContext&) const;
                    413:        void    AssertValid() const;
                    414: #endif
                    415: };
                    416: 
                    417: 
                    418: 
                    419: ////////////////////////////////////////////////////////////////////////////
                    420: 
                    421: 
                    422: class CStringArray : public CObject
                    423: {
                    424: 
                    425:        DECLARE_SERIAL(CStringArray)
                    426: public:
                    427: 
                    428: // Construction
                    429:        CStringArray();
                    430: 
                    431: // Attributes
                    432:        int     GetSize() const
                    433:                                { return m_nSize; }
                    434:        int     GetUpperBound() const
                    435:                                { return m_nSize-1; }
                    436:        void    SetSize(int nNewSize, int nGrowBy = -1);
                    437: 
                    438: // Operations
                    439:        // Clean up
                    440:        void    FreeExtra();
                    441:        void    RemoveAll()
                    442:                                { SetSize(0); }
                    443: 
                    444:        // Accessing elements
                    445:        CString    GetAt(int nIndex) const
                    446:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    447:                                        return m_pData[nIndex]; }
                    448:        void    SetAt(int nIndex, const char* newElement)
                    449:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    450:                                        m_pData[nIndex] = newElement; }
                    451:        CString&   ElementAt(int nIndex)
                    452:                                { ASSERT(nIndex >= 0 && nIndex < m_nSize);
                    453:                                        return m_pData[nIndex]; }
                    454: 
                    455:        // Potentially growing the array
                    456:        void    SetAtGrow(int nIndex, const char* newElement);
                    457:        int     Add(const char* newElement)
                    458:                                { int nIndex = m_nSize;
                    459:                                        SetAtGrow(nIndex, newElement);
                    460:                                        return nIndex; }
                    461: 
                    462:        // overloaded operator helpers
                    463:        CString    operator[](int nIndex) const
                    464:                                { return GetAt(nIndex); }
                    465:        CString&   operator[](int nIndex)
                    466:                                { return ElementAt(nIndex); }
                    467: 
                    468:        // Operations that move elements around
                    469:        void    InsertAt(int nIndex, const char* newElement, int nCount = 1);
                    470:        void    RemoveAt(int nIndex, int nCount = 1);
                    471:        void    InsertAt(int nStartIndex, CStringArray* pNewArray);
                    472: 
                    473: // Implementation
                    474: protected:
                    475:        CString*   m_pData;        // the actual array of data
                    476:        int     m_nSize;        // # of elements (upperBound - 1)
                    477:        int     m_nMaxSize;     // max allocated
                    478:        int     m_nGrowBy;      // grow amount
                    479: 
                    480: public:
                    481:        ~CStringArray();
                    482: 
                    483:        void    Serialize(CArchive&);
                    484: #ifdef _DEBUG
                    485:        void    Dump(CDumpContext&) const;
                    486:        void    AssertValid() const;
                    487: #endif
                    488: };
                    489: 
                    490: 
                    491: 
                    492: /////////////////////////////////////////////////////////////////////////////
                    493: 
                    494: 
                    495: class CPtrList : public CObject
                    496: {
                    497: 
                    498:        DECLARE_DYNAMIC(CPtrList)
                    499: 
                    500: protected:
                    501:        struct CNode
                    502:        {
                    503:                CNode*  pNext;
                    504:                CNode*  pPrev;
                    505:                void*    data;
                    506:        };
                    507: public:
                    508: 
                    509: // Construction
                    510:        CPtrList(int nBlockSize=10);
                    511: 
                    512: // Attributes (head and tail)
                    513:        // count of elements
                    514:        int     GetCount() const
                    515:                                { return m_nCount; }
                    516:        BOOL    IsEmpty() const
                    517:                                { return m_nCount == 0; }
                    518: 
                    519:        // peek at head or tail
                    520:        void*&   GetHead()
                    521:                                { ASSERT(m_pNodeHead != NULL);
                    522:                                        return m_pNodeHead->data; }
                    523:        void*    GetHead() const
                    524:                                { ASSERT(m_pNodeHead != NULL);
                    525:                                        return m_pNodeHead->data; }
                    526:        void*&   GetTail()
                    527:                                { ASSERT(m_pNodeTail != NULL);
                    528:                                        return m_pNodeTail->data; }
                    529:        void*    GetTail() const
                    530:                                { ASSERT(m_pNodeTail != NULL);
                    531:                                        return m_pNodeTail->data; }
                    532: 
                    533: // Operations
                    534:        // get head or tail (and remove it) - don't call on empty list !
                    535:        void*    RemoveHead();
                    536:        void*    RemoveTail();
                    537: 
                    538:        // add before head or after tail
                    539:        POSITION AddHead(void* newElement);
                    540:        POSITION AddTail(void* newElement);
                    541: 
                    542:        // add another list of elements before head or after tail
                    543:        void    AddHead(CPtrList* pNewList);
                    544:        void    AddTail(CPtrList* pNewList);
                    545: 
                    546:        // remove all elements
                    547:        void    RemoveAll();
                    548: 
                    549:        // iteration
                    550:        POSITION GetHeadPosition() const
                    551:                                { return (POSITION) m_pNodeHead; }
                    552:        POSITION GetTailPosition() const
                    553:                                { return (POSITION) m_pNodeTail; }
                    554:        void*&   GetNext(POSITION& rPosition) // return *Position++
                    555:                                { CNode* pNode = (CNode*) rPosition;
                    556:                                        ASSERT(pNode != NULL);
                    557:                                        rPosition = (POSITION) pNode->pNext;
                    558:                                        return pNode->data; }
                    559:        void*    GetNext(POSITION& rPosition) const // return *Position++
                    560:                                { CNode* pNode = (CNode*) rPosition;
                    561:                                        ASSERT(pNode != NULL);
                    562:                                        rPosition = (POSITION) pNode->pNext;
                    563:                                        return pNode->data; }
                    564:        void*&   GetPrev(POSITION& rPosition) // return *Position--
                    565:                                { CNode* pNode = (CNode*) rPosition;
                    566:                                        ASSERT(pNode != NULL);
                    567:                                        rPosition = (POSITION) pNode->pPrev;
                    568:                                        return pNode->data; }
                    569:        void*    GetPrev(POSITION& rPosition) const // return *Position--
                    570:                                { CNode* pNode = (CNode*) rPosition;
                    571:                                        ASSERT(pNode != NULL);
                    572:                                        rPosition = (POSITION) pNode->pPrev;
                    573:                                        return pNode->data; }
                    574: 
                    575:        // getting/modifying an element at a given position
                    576:        void*&   GetAt(POSITION position)
                    577:                                { CNode* pNode = (CNode*) position;
                    578:                                        ASSERT(pNode != NULL);
                    579:                                        return pNode->data; }
                    580:        void*    GetAt(POSITION position) const
                    581:                                { CNode* pNode = (CNode*) position;
                    582:                                        ASSERT(pNode != NULL);
                    583:                                        return pNode->data; }
                    584:        void    SetAt(POSITION pos, void* newElement)
                    585:                                { CNode* pNode = (CNode*) pos;
                    586:                                        ASSERT(pNode != NULL);
                    587:                                        pNode->data = newElement; }
                    588:        void    RemoveAt(POSITION position);
                    589: 
                    590:        // inserting before or after a given position
                    591:        POSITION InsertBefore(POSITION position, void* newElement);
                    592:        POSITION InsertAfter(POSITION position, void* newElement);
                    593: 
                    594:        // helper functions (note: O(n) speed)
                    595:        POSITION Find(void* searchValue, POSITION startAfter = NULL) const;
                    596:                                                // defaults to starting at the HEAD
                    597:                                                // return NULL if not found
                    598:        POSITION FindIndex(int nIndex) const;
                    599:                                                // get the 'nIndex'th element (may return NULL)
                    600: 
                    601: // Implementation
                    602: protected:
                    603:        CNode*  m_pNodeHead;
                    604:        CNode*  m_pNodeTail;
                    605:        int     m_nCount;
                    606:        CNode*  m_pNodeFree;
                    607:        struct CPlex* m_pBlocks;
                    608:        int     m_nBlockSize;
                    609: 
                    610:        CNode*  NewNode(CNode*, CNode*);
                    611:        void    FreeNode(CNode*);
                    612: 
                    613: public:
                    614:        ~CPtrList();
                    615: #ifdef _DEBUG
                    616:        void    Dump(CDumpContext&) const;
                    617:        void    AssertValid() const;
                    618: #endif
                    619: };
                    620: 
                    621: 
                    622: 
                    623: /////////////////////////////////////////////////////////////////////////////
                    624: 
                    625: 
                    626: class CObList : public CObject
                    627: {
                    628: 
                    629:        DECLARE_SERIAL(CObList)
                    630: 
                    631: protected:
                    632:        struct CNode
                    633:        {
                    634:                CNode*  pNext;
                    635:                CNode*  pPrev;
                    636:                CObject*    data;
                    637:        };
                    638: public:
                    639: 
                    640: // Construction
                    641:        CObList(int nBlockSize=10);
                    642: 
                    643: // Attributes (head and tail)
                    644:        // count of elements
                    645:        int     GetCount() const
                    646:                                { return m_nCount; }
                    647:        BOOL    IsEmpty() const
                    648:                                { return m_nCount == 0; }
                    649: 
                    650:        // peek at head or tail
                    651:        CObject*&   GetHead()
                    652:                                { ASSERT(m_pNodeHead != NULL);
                    653:                                        return m_pNodeHead->data; }
                    654:        CObject*    GetHead() const
                    655:                                { ASSERT(m_pNodeHead != NULL);
                    656:                                        return m_pNodeHead->data; }
                    657:        CObject*&   GetTail()
                    658:                                { ASSERT(m_pNodeTail != NULL);
                    659:                                        return m_pNodeTail->data; }
                    660:        CObject*    GetTail() const
                    661:                                { ASSERT(m_pNodeTail != NULL);
                    662:                                        return m_pNodeTail->data; }
                    663: 
                    664: // Operations
                    665:        // get head or tail (and remove it) - don't call on empty list !
                    666:        CObject*    RemoveHead();
                    667:        CObject*    RemoveTail();
                    668: 
                    669:        // add before head or after tail
                    670:        POSITION AddHead(CObject* newElement);
                    671:        POSITION AddTail(CObject* newElement);
                    672: 
                    673:        // add another list of elements before head or after tail
                    674:        void    AddHead(CObList* pNewList);
                    675:        void    AddTail(CObList* pNewList);
                    676: 
                    677:        // remove all elements
                    678:        void    RemoveAll();
                    679: 
                    680:        // iteration
                    681:        POSITION GetHeadPosition() const
                    682:                                { return (POSITION) m_pNodeHead; }
                    683:        POSITION GetTailPosition() const
                    684:                                { return (POSITION) m_pNodeTail; }
                    685:        CObject*&   GetNext(POSITION& rPosition) // return *Position++
                    686:                                { CNode* pNode = (CNode*) rPosition;
                    687:                                        ASSERT(pNode != NULL);
                    688:                                        rPosition = (POSITION) pNode->pNext;
                    689:                                        return pNode->data; }
                    690:        CObject*    GetNext(POSITION& rPosition) const // return *Position++
                    691:                                { CNode* pNode = (CNode*) rPosition;
                    692:                                        ASSERT(pNode != NULL);
                    693:                                        rPosition = (POSITION) pNode->pNext;
                    694:                                        return pNode->data; }
                    695:        CObject*&   GetPrev(POSITION& rPosition) // return *Position--
                    696:                                { CNode* pNode = (CNode*) rPosition;
                    697:                                        ASSERT(pNode != NULL);
                    698:                                        rPosition = (POSITION) pNode->pPrev;
                    699:                                        return pNode->data; }
                    700:        CObject*    GetPrev(POSITION& rPosition) const // return *Position--
                    701:                                { CNode* pNode = (CNode*) rPosition;
                    702:                                        ASSERT(pNode != NULL);
                    703:                                        rPosition = (POSITION) pNode->pPrev;
                    704:                                        return pNode->data; }
                    705: 
                    706:        // getting/modifying an element at a given position
                    707:        CObject*&   GetAt(POSITION position)
                    708:                                { CNode* pNode = (CNode*) position;
                    709:                                        ASSERT(pNode != NULL);
                    710:                                        return pNode->data; }
                    711:        CObject*    GetAt(POSITION position) const
                    712:                                { CNode* pNode = (CNode*) position;
                    713:                                        ASSERT(pNode != NULL);
                    714:                                        return pNode->data; }
                    715:        void    SetAt(POSITION pos, CObject* newElement)
                    716:                                { CNode* pNode = (CNode*) pos;
                    717:                                        ASSERT(pNode != NULL);
                    718:                                        pNode->data = newElement; }
                    719:        void    RemoveAt(POSITION position);
                    720: 
                    721:        // inserting before or after a given position
                    722:        POSITION InsertBefore(POSITION position, CObject* newElement);
                    723:        POSITION InsertAfter(POSITION position, CObject* newElement);
                    724: 
                    725:        // helper functions (note: O(n) speed)
                    726:        POSITION Find(CObject* searchValue, POSITION startAfter = NULL) const;
                    727:                                                // defaults to starting at the HEAD
                    728:                                                // return NULL if not found
                    729:        POSITION FindIndex(int nIndex) const;
                    730:                                                // get the 'nIndex'th element (may return NULL)
                    731: 
                    732: // Implementation
                    733: protected:
                    734:        CNode*  m_pNodeHead;
                    735:        CNode*  m_pNodeTail;
                    736:        int     m_nCount;
                    737:        CNode*  m_pNodeFree;
                    738:        struct CPlex* m_pBlocks;
                    739:        int     m_nBlockSize;
                    740: 
                    741:        CNode*  NewNode(CNode*, CNode*);
                    742:        void    FreeNode(CNode*);
                    743: 
                    744: public:
                    745:        ~CObList();
                    746: 
                    747:        void    Serialize(CArchive&);
                    748: #ifdef _DEBUG
                    749:        void    Dump(CDumpContext&) const;
                    750:        void    AssertValid() const;
                    751: #endif
                    752: };
                    753: 
                    754: 
                    755: 
                    756: /////////////////////////////////////////////////////////////////////////////
                    757: 
                    758: 
                    759: class CStringList : public CObject
                    760: {
                    761: 
                    762:        DECLARE_SERIAL(CStringList)
                    763: 
                    764: protected:
                    765:        struct CNode
                    766:        {
                    767:                CNode*  pNext;
                    768:                CNode*  pPrev;
                    769:                CString    data;
                    770:        };
                    771: public:
                    772: 
                    773: // Construction
                    774:        CStringList(int nBlockSize=10);
                    775: 
                    776: // Attributes (head and tail)
                    777:        // count of elements
                    778:        int     GetCount() const
                    779:                                { return m_nCount; }
                    780:        BOOL    IsEmpty() const
                    781:                                { return m_nCount == 0; }
                    782: 
                    783:        // peek at head or tail
                    784:        CString&   GetHead()
                    785:                                { ASSERT(m_pNodeHead != NULL);
                    786:                                        return m_pNodeHead->data; }
                    787:        CString    GetHead() const
                    788:                                { ASSERT(m_pNodeHead != NULL);
                    789:                                        return m_pNodeHead->data; }
                    790:        CString&   GetTail()
                    791:                                { ASSERT(m_pNodeTail != NULL);
                    792:                                        return m_pNodeTail->data; }
                    793:        CString    GetTail() const
                    794:                                { ASSERT(m_pNodeTail != NULL);
                    795:                                        return m_pNodeTail->data; }
                    796: 
                    797: // Operations
                    798:        // get head or tail (and remove it) - don't call on empty list !
                    799:        CString    RemoveHead();
                    800:        CString    RemoveTail();
                    801: 
                    802:        // add before head or after tail
                    803:        POSITION AddHead(const char* newElement);
                    804:        POSITION AddTail(const char* newElement);
                    805: 
                    806:        // add another list of elements before head or after tail
                    807:        void    AddHead(CStringList* pNewList);
                    808:        void    AddTail(CStringList* pNewList);
                    809: 
                    810:        // remove all elements
                    811:        void    RemoveAll();
                    812: 
                    813:        // iteration
                    814:        POSITION GetHeadPosition() const
                    815:                                { return (POSITION) m_pNodeHead; }
                    816:        POSITION GetTailPosition() const
                    817:                                { return (POSITION) m_pNodeTail; }
                    818:        CString&   GetNext(POSITION& rPosition) // return *Position++
                    819:                                { CNode* pNode = (CNode*) rPosition;
                    820:                                        ASSERT(pNode != NULL);
                    821:                                        rPosition = (POSITION) pNode->pNext;
                    822:                                        return pNode->data; }
                    823:        CString    GetNext(POSITION& rPosition) const // return *Position++
                    824:                                { CNode* pNode = (CNode*) rPosition;
                    825:                                        ASSERT(pNode != NULL);
                    826:                                        rPosition = (POSITION) pNode->pNext;
                    827:                                        return pNode->data; }
                    828:        CString&   GetPrev(POSITION& rPosition) // return *Position--
                    829:                                { CNode* pNode = (CNode*) rPosition;
                    830:                                        ASSERT(pNode != NULL);
                    831:                                        rPosition = (POSITION) pNode->pPrev;
                    832:                                        return pNode->data; }
                    833:        CString    GetPrev(POSITION& rPosition) const // return *Position--
                    834:                                { CNode* pNode = (CNode*) rPosition;
                    835:                                        ASSERT(pNode != NULL);
                    836:                                        rPosition = (POSITION) pNode->pPrev;
                    837:                                        return pNode->data; }
                    838: 
                    839:        // getting/modifying an element at a given position
                    840:        CString&   GetAt(POSITION position)
                    841:                                { CNode* pNode = (CNode*) position;
                    842:                                        ASSERT(pNode != NULL);
                    843:                                        return pNode->data; }
                    844:        CString    GetAt(POSITION position) const
                    845:                                { CNode* pNode = (CNode*) position;
                    846:                                        ASSERT(pNode != NULL);
                    847:                                        return pNode->data; }
                    848:        void    SetAt(POSITION pos, const char* newElement)
                    849:                                { CNode* pNode = (CNode*) pos;
                    850:                                        ASSERT(pNode != NULL);
                    851:                                        pNode->data = newElement; }
                    852:        void    RemoveAt(POSITION position);
                    853: 
                    854:        // inserting before or after a given position
                    855:        POSITION InsertBefore(POSITION position, const char* newElement);
                    856:        POSITION InsertAfter(POSITION position, const char* newElement);
                    857: 
                    858:        // helper functions (note: O(n) speed)
                    859:        POSITION Find(const char* searchValue, POSITION startAfter = NULL) const;
                    860:                                                // defaults to starting at the HEAD
                    861:                                                // return NULL if not found
                    862:        POSITION FindIndex(int nIndex) const;
                    863:                                                // get the 'nIndex'th element (may return NULL)
                    864: 
                    865: // Implementation
                    866: protected:
                    867:        CNode*  m_pNodeHead;
                    868:        CNode*  m_pNodeTail;
                    869:        int     m_nCount;
                    870:        CNode*  m_pNodeFree;
                    871:        struct CPlex* m_pBlocks;
                    872:        int     m_nBlockSize;
                    873: 
                    874:        CNode*  NewNode(CNode*, CNode*);
                    875:        void    FreeNode(CNode*);
                    876: 
                    877: public:
                    878:        ~CStringList();
                    879: 
                    880:        void    Serialize(CArchive&);
                    881: #ifdef _DEBUG
                    882:        void    Dump(CDumpContext&) const;
                    883:        void    AssertValid() const;
                    884: #endif
                    885: };
                    886: 
                    887: 
                    888: 
                    889: /////////////////////////////////////////////////////////////////////////////
                    890: 
                    891: 
                    892: class CMapWordToPtr : public CObject
                    893: {
                    894: 
                    895:        DECLARE_DYNAMIC(CMapWordToPtr)
                    896: protected:
                    897:        // Association
                    898:        struct CAssoc
                    899:        {
                    900:                CAssoc* pNext;
                    901:                UINT    nHashValue; // needed for efficient iteration
                    902:                WORD     key;
                    903:                void*   value;
                    904:        };
                    905: public:
                    906: 
                    907: // Construction
                    908:        CMapWordToPtr(int nBlockSize=10);
                    909: 
                    910: // Attributes
                    911:        // number of elements
                    912:        int     GetCount() const
                    913:                                { return m_nCount; }
                    914:        BOOL    IsEmpty() const
                    915:                                { return m_nCount == 0; }
                    916:        // Lookup
                    917:        BOOL    Lookup(WORD key, void*& rValue) const;
                    918: 
                    919: // Operations
                    920:        // Lookup and add if not there
                    921:        void*&  operator[](WORD key);
                    922: 
                    923:        // add a new (key, value) pair
                    924:        void    SetAt(WORD key, void* newValue)
                    925:                                { (*this)[key] = newValue; }
                    926: 
                    927:        // removing existing (key, ?) pair
                    928:        BOOL    RemoveKey(WORD key);
                    929:        void    RemoveAll();
                    930: 
                    931:        // iterating all (key, value) pairs
                    932:        POSITION GetStartPosition() const
                    933:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                    934:        void    GetNextAssoc(POSITION& rNextPosition, WORD& rKey, void*& rValue) const;
                    935: 
                    936:        // advanced features for derived classes
                    937:        UINT    GetHashTableSize() const
                    938:                                { return m_nHashTableSize; }
                    939:        void    InitHashTable(UINT hashSize);
                    940: 
                    941: // Overridables: special non-virtual (see map implementation for details)
                    942:        // Routine used to user-provided hash keys
                    943:        UINT    HashKey(WORD key) const;
                    944: 
                    945: // Implementation
                    946: protected:
                    947:        CAssoc** m_pHashTable;
                    948:        UINT    m_nHashTableSize;
                    949:        int     m_nCount;
                    950:        CAssoc* m_pFreeList;
                    951:        struct CPlex* m_pBlocks;
                    952:        int     m_nBlockSize;
                    953: 
                    954:        CAssoc* NewAssoc();
                    955:        void    FreeAssoc(CAssoc*);
                    956:        CAssoc* GetAssocAt(WORD, UINT&) const;
                    957: 
                    958: public:
                    959:        ~CMapWordToPtr();
                    960: #ifdef _DEBUG
                    961:        void    Dump(CDumpContext&) const;
                    962:        void    AssertValid() const;
                    963: #endif
                    964: };
                    965: 
                    966: 
                    967: 
                    968: /////////////////////////////////////////////////////////////////////////////
                    969: 
                    970: 
                    971: class CMapPtrToWord : public CObject
                    972: {
                    973: 
                    974:        DECLARE_DYNAMIC(CMapPtrToWord)
                    975: protected:
                    976:        // Association
                    977:        struct CAssoc
                    978:        {
                    979:                CAssoc* pNext;
                    980:                UINT    nHashValue; // needed for efficient iteration
                    981:                void*     key;
                    982:                WORD   value;
                    983:        };
                    984: public:
                    985: 
                    986: // Construction
                    987:        CMapPtrToWord(int nBlockSize=10);
                    988: 
                    989: // Attributes
                    990:        // number of elements
                    991:        int     GetCount() const
                    992:                                { return m_nCount; }
                    993:        BOOL    IsEmpty() const
                    994:                                { return m_nCount == 0; }
                    995:        // Lookup
                    996:        BOOL    Lookup(void* key, WORD& rValue) const;
                    997: 
                    998: // Operations
                    999:        // Lookup and add if not there
                   1000:        WORD&  operator[](void* key);
                   1001: 
                   1002:        // add a new (key, value) pair
                   1003:        void    SetAt(void* key, WORD newValue)
                   1004:                                { (*this)[key] = newValue; }
                   1005: 
                   1006:        // removing existing (key, ?) pair
                   1007:        BOOL    RemoveKey(void* key);
                   1008:        void    RemoveAll();
                   1009: 
                   1010:        // iterating all (key, value) pairs
                   1011:        POSITION GetStartPosition() const
                   1012:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1013:        void    GetNextAssoc(POSITION& rNextPosition, void*& rKey, WORD& rValue) const;
                   1014: 
                   1015:        // advanced features for derived classes
                   1016:        UINT    GetHashTableSize() const
                   1017:                                { return m_nHashTableSize; }
                   1018:        void    InitHashTable(UINT hashSize);
                   1019: 
                   1020: // Overridables: special non-virtual (see map implementation for details)
                   1021:        // Routine used to user-provided hash keys
                   1022:        UINT    HashKey(void* key) const;
                   1023: 
                   1024: // Implementation
                   1025: protected:
                   1026:        CAssoc** m_pHashTable;
                   1027:        UINT    m_nHashTableSize;
                   1028:        int     m_nCount;
                   1029:        CAssoc* m_pFreeList;
                   1030:        struct CPlex* m_pBlocks;
                   1031:        int     m_nBlockSize;
                   1032: 
                   1033:        CAssoc* NewAssoc();
                   1034:        void    FreeAssoc(CAssoc*);
                   1035:        CAssoc* GetAssocAt(void*, UINT&) const;
                   1036: 
                   1037: public:
                   1038:        ~CMapPtrToWord();
                   1039: #ifdef _DEBUG
                   1040:        void    Dump(CDumpContext&) const;
                   1041:        void    AssertValid() const;
                   1042: #endif
                   1043: };
                   1044: 
                   1045: 
                   1046: 
                   1047: /////////////////////////////////////////////////////////////////////////////
                   1048: 
                   1049: 
                   1050: class CMapPtrToPtr : public CObject
                   1051: {
                   1052: 
                   1053:        DECLARE_DYNAMIC(CMapPtrToPtr)
                   1054: protected:
                   1055:        // Association
                   1056:        struct CAssoc
                   1057:        {
                   1058:                CAssoc* pNext;
                   1059:                UINT    nHashValue; // needed for efficient iteration
                   1060:                void*     key;
                   1061:                void*   value;
                   1062:        };
                   1063: public:
                   1064: 
                   1065: // Construction
                   1066:        CMapPtrToPtr(int nBlockSize=10);
                   1067: 
                   1068: // Attributes
                   1069:        // number of elements
                   1070:        int     GetCount() const
                   1071:                                { return m_nCount; }
                   1072:        BOOL    IsEmpty() const
                   1073:                                { return m_nCount == 0; }
                   1074:        // Lookup
                   1075:        BOOL    Lookup(void* key, void*& rValue) const;
                   1076: 
                   1077: // Operations
                   1078:        // Lookup and add if not there
                   1079:        void*&  operator[](void* key);
                   1080: 
                   1081:        // add a new (key, value) pair
                   1082:        void    SetAt(void* key, void* newValue)
                   1083:                                { (*this)[key] = newValue; }
                   1084: 
                   1085:        // removing existing (key, ?) pair
                   1086:        BOOL    RemoveKey(void* key);
                   1087:        void    RemoveAll();
                   1088: 
                   1089:        // iterating all (key, value) pairs
                   1090:        POSITION GetStartPosition() const
                   1091:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1092:        void    GetNextAssoc(POSITION& rNextPosition, void*& rKey, void*& rValue) const;
                   1093: 
                   1094:        // advanced features for derived classes
                   1095:        UINT    GetHashTableSize() const
                   1096:                                { return m_nHashTableSize; }
                   1097:        void    InitHashTable(UINT hashSize);
                   1098: 
                   1099: // Overridables: special non-virtual (see map implementation for details)
                   1100:        // Routine used to user-provided hash keys
                   1101:        UINT    HashKey(void* key) const;
                   1102: 
                   1103: // Implementation
                   1104: protected:
                   1105:        CAssoc** m_pHashTable;
                   1106:        UINT    m_nHashTableSize;
                   1107:        int     m_nCount;
                   1108:        CAssoc* m_pFreeList;
                   1109:        struct CPlex* m_pBlocks;
                   1110:        int     m_nBlockSize;
                   1111: 
                   1112:        CAssoc* NewAssoc();
                   1113:        void    FreeAssoc(CAssoc*);
                   1114:        CAssoc* GetAssocAt(void*, UINT&) const;
                   1115: 
                   1116: public:
                   1117:        ~CMapPtrToPtr();
                   1118: #ifdef _DEBUG
                   1119:        void    Dump(CDumpContext&) const;
                   1120:        void    AssertValid() const;
                   1121: #endif
                   1122: };
                   1123: 
                   1124: 
                   1125: 
                   1126: /////////////////////////////////////////////////////////////////////////////
                   1127: 
                   1128: 
                   1129: class CMapWordToOb : public CObject
                   1130: {
                   1131: 
                   1132:        DECLARE_SERIAL(CMapWordToOb)
                   1133: protected:
                   1134:        // Association
                   1135:        struct CAssoc
                   1136:        {
                   1137:                CAssoc* pNext;
                   1138:                UINT    nHashValue; // needed for efficient iteration
                   1139:                WORD     key;
                   1140:                CObject*   value;
                   1141:        };
                   1142: public:
                   1143: 
                   1144: // Construction
                   1145:        CMapWordToOb(int nBlockSize=10);
                   1146: 
                   1147: // Attributes
                   1148:        // number of elements
                   1149:        int     GetCount() const
                   1150:                                { return m_nCount; }
                   1151:        BOOL    IsEmpty() const
                   1152:                                { return m_nCount == 0; }
                   1153:        // Lookup
                   1154:        BOOL    Lookup(WORD key, CObject*& rValue) const;
                   1155: 
                   1156: // Operations
                   1157:        // Lookup and add if not there
                   1158:        CObject*&  operator[](WORD key);
                   1159: 
                   1160:        // add a new (key, value) pair
                   1161:        void    SetAt(WORD key, CObject* newValue)
                   1162:                                { (*this)[key] = newValue; }
                   1163: 
                   1164:        // removing existing (key, ?) pair
                   1165:        BOOL    RemoveKey(WORD key);
                   1166:        void    RemoveAll();
                   1167: 
                   1168:        // iterating all (key, value) pairs
                   1169:        POSITION GetStartPosition() const
                   1170:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1171:        void    GetNextAssoc(POSITION& rNextPosition, WORD& rKey, CObject*& rValue) const;
                   1172: 
                   1173:        // advanced features for derived classes
                   1174:        UINT    GetHashTableSize() const
                   1175:                                { return m_nHashTableSize; }
                   1176:        void    InitHashTable(UINT hashSize);
                   1177: 
                   1178: // Overridables: special non-virtual (see map implementation for details)
                   1179:        // Routine used to user-provided hash keys
                   1180:        UINT    HashKey(WORD key) const;
                   1181: 
                   1182: // Implementation
                   1183: protected:
                   1184:        CAssoc** m_pHashTable;
                   1185:        UINT    m_nHashTableSize;
                   1186:        int     m_nCount;
                   1187:        CAssoc* m_pFreeList;
                   1188:        struct CPlex* m_pBlocks;
                   1189:        int     m_nBlockSize;
                   1190: 
                   1191:        CAssoc* NewAssoc();
                   1192:        void    FreeAssoc(CAssoc*);
                   1193:        CAssoc* GetAssocAt(WORD, UINT&) const;
                   1194: 
                   1195: public:
                   1196:        ~CMapWordToOb();
                   1197: 
                   1198:        void    Serialize(CArchive&);
                   1199: #ifdef _DEBUG
                   1200:        void    Dump(CDumpContext&) const;
                   1201:        void    AssertValid() const;
                   1202: #endif
                   1203: };
                   1204: 
                   1205: 
                   1206: 
                   1207: /////////////////////////////////////////////////////////////////////////////
                   1208: 
                   1209: 
                   1210: class CMapStringToPtr : public CObject
                   1211: {
                   1212: 
                   1213:        DECLARE_DYNAMIC(CMapStringToPtr)
                   1214: protected:
                   1215:        // Association
                   1216:        struct CAssoc
                   1217:        {
                   1218:                CAssoc* pNext;
                   1219:                UINT    nHashValue; // needed for efficient iteration
                   1220:                CString key;
                   1221:                void*   value;
                   1222:        };
                   1223: public:
                   1224: 
                   1225: // Construction
                   1226:        CMapStringToPtr(int nBlockSize=10);
                   1227: 
                   1228: // Attributes
                   1229:        // number of elements
                   1230:        int     GetCount() const
                   1231:                                { return m_nCount; }
                   1232:        BOOL    IsEmpty() const
                   1233:                                { return m_nCount == 0; }
                   1234:        // Lookup
                   1235:        BOOL    Lookup(const char* key, void*& rValue) const;
                   1236: 
                   1237: // Operations
                   1238:        // Lookup and add if not there
                   1239:        void*&  operator[](const char* key);
                   1240: 
                   1241:        // add a new (key, value) pair
                   1242:        void    SetAt(const char* key, void* newValue)
                   1243:                                { (*this)[key] = newValue; }
                   1244: 
                   1245:        // removing existing (key, ?) pair
                   1246:        BOOL    RemoveKey(const char* key);
                   1247:        void    RemoveAll();
                   1248: 
                   1249:        // iterating all (key, value) pairs
                   1250:        POSITION GetStartPosition() const
                   1251:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1252:        void    GetNextAssoc(POSITION& rNextPosition, CString& rKey, void*& rValue) const;
                   1253: 
                   1254:        // advanced features for derived classes
                   1255:        UINT    GetHashTableSize() const
                   1256:                                { return m_nHashTableSize; }
                   1257:        void    InitHashTable(UINT hashSize);
                   1258: 
                   1259: // Overridables: special non-virtual (see map implementation for details)
                   1260:        // Routine used to user-provided hash keys
                   1261:        UINT    HashKey(const char* key) const;
                   1262: 
                   1263: // Implementation
                   1264: protected:
                   1265:        CAssoc** m_pHashTable;
                   1266:        UINT    m_nHashTableSize;
                   1267:        int     m_nCount;
                   1268:        CAssoc* m_pFreeList;
                   1269:        struct CPlex* m_pBlocks;
                   1270:        int     m_nBlockSize;
                   1271: 
                   1272:        CAssoc* NewAssoc();
                   1273:        void    FreeAssoc(CAssoc*);
                   1274:        CAssoc* GetAssocAt(const char*, UINT&) const;
                   1275: 
                   1276: public:
                   1277:        ~CMapStringToPtr();
                   1278: #ifdef _DEBUG
                   1279:        void    Dump(CDumpContext&) const;
                   1280:        void    AssertValid() const;
                   1281: #endif
                   1282: };
                   1283: 
                   1284: 
                   1285: 
                   1286: /////////////////////////////////////////////////////////////////////////////
                   1287: 
                   1288: 
                   1289: class CMapStringToOb : public CObject
                   1290: {
                   1291: 
                   1292:        DECLARE_SERIAL(CMapStringToOb)
                   1293: protected:
                   1294:        // Association
                   1295:        struct CAssoc
                   1296:        {
                   1297:                CAssoc* pNext;
                   1298:                UINT    nHashValue; // needed for efficient iteration
                   1299:                CString key;
                   1300:                CObject*   value;
                   1301:        };
                   1302: public:
                   1303: 
                   1304: // Construction
                   1305:        CMapStringToOb(int nBlockSize=10);
                   1306: 
                   1307: // Attributes
                   1308:        // number of elements
                   1309:        int     GetCount() const
                   1310:                                { return m_nCount; }
                   1311:        BOOL    IsEmpty() const
                   1312:                                { return m_nCount == 0; }
                   1313:        // Lookup
                   1314:        BOOL    Lookup(const char* key, CObject*& rValue) const;
                   1315: 
                   1316: // Operations
                   1317:        // Lookup and add if not there
                   1318:        CObject*&  operator[](const char* key);
                   1319: 
                   1320:        // add a new (key, value) pair
                   1321:        void    SetAt(const char* key, CObject* newValue)
                   1322:                                { (*this)[key] = newValue; }
                   1323: 
                   1324:        // removing existing (key, ?) pair
                   1325:        BOOL    RemoveKey(const char* key);
                   1326:        void    RemoveAll();
                   1327: 
                   1328:        // iterating all (key, value) pairs
                   1329:        POSITION GetStartPosition() const
                   1330:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1331:        void    GetNextAssoc(POSITION& rNextPosition, CString& rKey, CObject*& rValue) const;
                   1332: 
                   1333:        // advanced features for derived classes
                   1334:        UINT    GetHashTableSize() const
                   1335:                                { return m_nHashTableSize; }
                   1336:        void    InitHashTable(UINT hashSize);
                   1337: 
                   1338: // Overridables: special non-virtual (see map implementation for details)
                   1339:        // Routine used to user-provided hash keys
                   1340:        UINT    HashKey(const char* key) const;
                   1341: 
                   1342: // Implementation
                   1343: protected:
                   1344:        CAssoc** m_pHashTable;
                   1345:        UINT    m_nHashTableSize;
                   1346:        int     m_nCount;
                   1347:        CAssoc* m_pFreeList;
                   1348:        struct CPlex* m_pBlocks;
                   1349:        int     m_nBlockSize;
                   1350: 
                   1351:        CAssoc* NewAssoc();
                   1352:        void    FreeAssoc(CAssoc*);
                   1353:        CAssoc* GetAssocAt(const char*, UINT&) const;
                   1354: 
                   1355: public:
                   1356:        ~CMapStringToOb();
                   1357: 
                   1358:        void    Serialize(CArchive&);
                   1359: #ifdef _DEBUG
                   1360:        void    Dump(CDumpContext&) const;
                   1361:        void    AssertValid() const;
                   1362: #endif
                   1363: };
                   1364: 
                   1365: 
                   1366: 
                   1367: /////////////////////////////////////////////////////////////////////////////
                   1368: 
                   1369: 
                   1370: class CMapStringToString : public CObject
                   1371: {
                   1372: 
                   1373:        DECLARE_SERIAL(CMapStringToString)
                   1374: protected:
                   1375:        // Association
                   1376:        struct CAssoc
                   1377:        {
                   1378:                CAssoc* pNext;
                   1379:                UINT    nHashValue; // needed for efficient iteration
                   1380:                CString key;
                   1381:                CString   value;
                   1382:        };
                   1383: public:
                   1384: 
                   1385: // Construction
                   1386:        CMapStringToString(int nBlockSize=10);
                   1387: 
                   1388: // Attributes
                   1389:        // number of elements
                   1390:        int     GetCount() const
                   1391:                                { return m_nCount; }
                   1392:        BOOL    IsEmpty() const
                   1393:                                { return m_nCount == 0; }
                   1394:        // Lookup
                   1395:        BOOL    Lookup(const char* key, CString& rValue) const;
                   1396: 
                   1397: // Operations
                   1398:        // Lookup and add if not there
                   1399:        CString&  operator[](const char* key);
                   1400: 
                   1401:        // add a new (key, value) pair
                   1402:        void    SetAt(const char* key, const char* newValue)
                   1403:                                { (*this)[key] = newValue; }
                   1404: 
                   1405:        // removing existing (key, ?) pair
                   1406:        BOOL    RemoveKey(const char* key);
                   1407:        void    RemoveAll();
                   1408: 
                   1409:        // iterating all (key, value) pairs
                   1410:        POSITION GetStartPosition() const
                   1411:                                { return (m_nCount == 0) ? NULL : BEFORE_START_POSITION; }
                   1412:        void    GetNextAssoc(POSITION& rNextPosition, CString& rKey, CString& rValue) const;
                   1413: 
                   1414:        // advanced features for derived classes
                   1415:        UINT    GetHashTableSize() const
                   1416:                                { return m_nHashTableSize; }
                   1417:        void    InitHashTable(UINT hashSize);
                   1418: 
                   1419: // Overridables: special non-virtual (see map implementation for details)
                   1420:        // Routine used to user-provided hash keys
                   1421:        UINT    HashKey(const char* key) const;
                   1422: 
                   1423: // Implementation
                   1424: protected:
                   1425:        CAssoc** m_pHashTable;
                   1426:        UINT    m_nHashTableSize;
                   1427:        int     m_nCount;
                   1428:        CAssoc* m_pFreeList;
                   1429:        struct CPlex* m_pBlocks;
                   1430:        int     m_nBlockSize;
                   1431: 
                   1432:        CAssoc* NewAssoc();
                   1433:        void    FreeAssoc(CAssoc*);
                   1434:        CAssoc* GetAssocAt(const char*, UINT&) const;
                   1435: 
                   1436: public:
                   1437:        ~CMapStringToString();
                   1438: 
                   1439:        void    Serialize(CArchive&);
                   1440: #ifdef _DEBUG
                   1441:        void    Dump(CDumpContext&) const;
                   1442:        void    AssertValid() const;
                   1443: #endif
                   1444: };
                   1445: 
                   1446: #undef THIS_FILE 
                   1447: #define THIS_FILE __FILE__ 
                   1448: #endif //!__AFXCOLL_H__ 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.