Annotation of mstools/samples/sdktools/capview/array_x.cpp, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: /////////////////////////////////////////////////////////////////////////////
        !             4: //
        !             5: // Implementation of Array of TYPEs
        !             6: //
        !             7: /////////////////////////////////////////////////////////////////////////////
        !             8: // NOTE: we allocate an array of 'm_nMaxSize' elements, but only
        !             9: //  the current size 'm_nSize' contains properly constructed
        !            10: //  objects.
        !            11: 
        !            12: #include "afxcoll.h"
        !            13: #pragma hdrstop
        !            14: 
        !            15: #ifdef AFX_COLL_SEG
        !            16: #pragma code_seg(AFX_COLL_SEG)
        !            17: #endif
        !            18: 
        !            19: #include <limits.h>
        !            20: #define SIZE_T_MAX  UINT_MAX            /* max size for a size_t */
        !            21: 
        !            22: #include "array_x.h"
        !            23: 
        !            24: IMPLEMENT_DYNAMIC(CAaaArray, CObject);
        !            25: 
        !            26: #ifdef _DEBUG
        !            27: #undef THIS_FILE
        !            28: static char BASED_CODE THIS_FILE[] = __FILE__;
        !            29: #endif
        !            30: 
        !            31: #define new DEBUG_NEW
        !            32: 
        !            33: /////////////////////////////////////////////////////////////////////////////
        !            34: 
        !            35: 
        !            36: /////////////////////////////////////////////////////////////////////////////
        !            37: 
        !            38:  
        !            39: CAaaArray::CAaaArray()
        !            40: {
        !            41:        m_pData = NULL;
        !            42:        m_nSize = m_nMaxSize = m_nGrowBy = 0;
        !            43: }
        !            44: 
        !            45:  
        !            46: CAaaArray::~CAaaArray()
        !            47: {
        !            48:        ASSERT_VALID(this);
        !            49: 
        !            50:        delete [] (BYTE*)m_pData;
        !            51: }
        !            52: 
        !            53:   
        !            54: void CAaaArray::SetSize(int nNewSize, int nGrowBy /* = -1 */)
        !            55: {
        !            56:        ASSERT_VALID(this);
        !            57:        ASSERT(nNewSize >= 0);
        !            58: 
        !            59:        if (nGrowBy != -1)
        !            60:                m_nGrowBy = nGrowBy;    // set new size
        !            61: 
        !            62:        if (nNewSize == 0)
        !            63:        {
        !            64:                // shrink to nothing
        !            65:                delete [] (BYTE*)m_pData;
        !            66:                m_pData = NULL;
        !            67:                m_nSize = m_nMaxSize = 0;
        !            68:        }
        !            69:        else if (m_pData == NULL)
        !            70:        {
        !            71:                // create one with exact size
        !            72: #ifdef SIZE_T_MAX
        !            73:                ASSERT((long)nNewSize * sizeof(AAA) <= SIZE_T_MAX);    // no overflow
        !            74: #endif
        !            75:                m_pData = (AAA*) new BYTE[nNewSize * sizeof(AAA)];
        !            76: 
        !            77:                memset(m_pData, 0, nNewSize * sizeof(AAA));        // zero fill
        !            78: 
        !            79:                m_nSize = m_nMaxSize = nNewSize;
        !            80:        }
        !            81:        else if (nNewSize <= m_nMaxSize)
        !            82:        {
        !            83:                // it fits
        !            84:                if (nNewSize > m_nSize)
        !            85:                {
        !            86:                        // initialize the new elements
        !            87: 
        !            88:                        memset(&m_pData[m_nSize], 0, (nNewSize-m_nSize) * sizeof(AAA));
        !            89: 
        !            90:                }
        !            91: 
        !            92:                m_nSize = nNewSize;
        !            93:        }
        !            94:        else
        !            95:        {
        !            96:                // Otherwise grow array
        !            97:                int nNewMax;
        !            98:                if (nNewSize < m_nMaxSize + m_nGrowBy)
        !            99:                        nNewMax = m_nMaxSize + m_nGrowBy;   // granularity
        !           100:                else
        !           101:                        nNewMax = nNewSize; // no slush
        !           102: 
        !           103: #ifdef SIZE_T_MAX
        !           104:                ASSERT((long)nNewMax * sizeof(AAA) <= SIZE_T_MAX); // no overflow
        !           105: #endif
        !           106:                AAA* pNewData = (AAA*) new BYTE[nNewMax * sizeof(AAA)];
        !           107: 
        !           108:                // copy new data from old
        !           109:                memcpy(pNewData, m_pData, m_nSize * sizeof(AAA));
        !           110: 
        !           111:                // construct remaining elements
        !           112:                ASSERT(nNewSize > m_nSize);
        !           113: 
        !           114:                memset(&pNewData[m_nSize], 0, (nNewSize-m_nSize) * sizeof(AAA));
        !           115: 
        !           116: 
        !           117:                // get rid of old stuff (note: no destructors called)
        !           118:                delete [] (BYTE*)m_pData;
        !           119:                m_pData = pNewData;
        !           120:                m_nSize = nNewSize;
        !           121:                m_nMaxSize = nNewMax;
        !           122:        }
        !           123: }
        !           124: 
        !           125:   
        !           126: void CAaaArray::FreeExtra()
        !           127: {
        !           128:        ASSERT_VALID(this);
        !           129: 
        !           130:        if (m_nSize != m_nMaxSize)
        !           131:        {
        !           132:                // shrink to desired size
        !           133: #ifdef SIZE_T_MAX
        !           134:                ASSERT((long)m_nSize * sizeof(AAA) <= SIZE_T_MAX); // no overflow
        !           135: #endif
        !           136:                AAA* pNewData = (AAA*) new BYTE[m_nSize * sizeof(AAA)];
        !           137:                // copy new data from old
        !           138:                memcpy(pNewData, m_pData, m_nSize * sizeof(AAA));
        !           139: 
        !           140:                // get rid of old stuff (note: no destructors called)
        !           141:                delete [] (BYTE*)m_pData;
        !           142:                m_pData = pNewData;
        !           143:                m_nMaxSize = m_nSize;
        !           144:        }
        !           145: }
        !           146: 
        !           147: /////////////////////////////////////////////////////////////////////////////
        !           148: 
        !           149:   
        !           150: void CAaaArray::SetAtGrow(int nIndex, AAA newElement)
        !           151: {
        !           152:        ASSERT(nIndex >= 0);
        !           153:        if (nIndex >= m_nSize)
        !           154:                SetSize(nIndex+1);
        !           155:        m_pData[nIndex] = newElement;
        !           156: }
        !           157: 
        !           158:   
        !           159: void CAaaArray::InsertAt(int nIndex, AAA newElement, int nCount /*=1*/)
        !           160: {
        !           161:        ASSERT_VALID(this);
        !           162:        ASSERT(nIndex >= 0);        // will expand to meet need
        !           163:        ASSERT(nCount > 0);     // zero or negative size not allowed
        !           164: 
        !           165:        if (nIndex >= m_nSize)
        !           166:        {
        !           167:                // adding after the end of the array
        !           168:                SetSize(nIndex + nCount);       // grow so nIndex is valid
        !           169:        }
        !           170:        else
        !           171:        {
        !           172:                // inserting in the middle of the array
        !           173:                int nOldSize = m_nSize;
        !           174:                SetSize(m_nSize + nCount); // grow it to new size
        !           175:                // shift old data up to fill gap
        !           176:                memmove(&m_pData[nIndex+nCount], &m_pData[nIndex],
        !           177:                        (nOldSize-nIndex) * sizeof(AAA));
        !           178: 
        !           179:                // re-init slots we copied from
        !           180: 
        !           181:                memset(&m_pData[nIndex], 0, nCount * sizeof(AAA));
        !           182: 
        !           183:        }
        !           184: 
        !           185:        // insert new value in the gap
        !           186:        ASSERT(nIndex + nCount <= m_nSize);
        !           187:        while (nCount--)
        !           188:                m_pData[nIndex++] = newElement;
        !           189: }
        !           190: 
        !           191:   
        !           192: void CAaaArray::RemoveAt(int nIndex, int nCount /* = 1 */)
        !           193: {
        !           194:        ASSERT_VALID(this);
        !           195:        ASSERT(nIndex >= 0);
        !           196:        ASSERT(nCount >= 0);
        !           197:        ASSERT(nIndex + nCount <= m_nSize);
        !           198: 
        !           199:        // just remove a range
        !           200:        int nMoveCount = m_nSize - (nIndex + nCount);
        !           201: 
        !           202:        if (nMoveCount)
        !           203:                memcpy(&m_pData[nIndex], &m_pData[nIndex + nCount],
        !           204:                        nMoveCount * sizeof(AAA));
        !           205:        m_nSize -= nCount;
        !           206: }
        !           207: 
        !           208:   
        !           209: void CAaaArray::InsertAt(int nStartIndex, CAaaArray* pNewArray)
        !           210: {
        !           211:        ASSERT_VALID(this);
        !           212:        ASSERT(pNewArray != NULL);
        !           213:        ASSERT(pNewArray->IsKindOf(RUNTIME_CLASS(CAaaArray)));
        !           214:        ASSERT_VALID(pNewArray);
        !           215:        ASSERT(nStartIndex >= 0);
        !           216: 
        !           217:        if (pNewArray->GetSize() > 0)
        !           218:        {
        !           219:                InsertAt(nStartIndex, pNewArray->GetAt(0), pNewArray->GetSize());
        !           220:                for (int i = 0; i < pNewArray->GetSize(); i++)
        !           221:                        SetAt(nStartIndex + i, pNewArray->GetAt(i));
        !           222:        }
        !           223: }
        !           224: 
        !           225: /////////////////////////////////////////////////////////////////////////////
        !           226: // Serialization
        !           227: 
        !           228:  
        !           229: 
        !           230: /////////////////////////////////////////////////////////////////////////////
        !           231: // Diagnostics
        !           232: 
        !           233: #if 0
        !           234: #ifdef _DEBUG
        !           235:   
        !           236: void CAaaArray::Dump(CDumpContext& dc) const
        !           237: {
        !           238:        ASSERT_VALID(this);
        !           239: 
        !           240: #define MAKESTRING(x) #x
        !           241:        dc << "a " MAKESTRING(CAaaArray) " with " << m_nSize << " elements";
        !           242: #undef MAKESTRING
        !           243:        if (dc.GetDepth() > 0)
        !           244:        {
        !           245:                dc << "\n";
        !           246:                for (int i = 0; i < m_nSize; i++)
        !           247:                        dc << "\n\t[" << i << "] = " << m_pData[i];
        !           248:        }
        !           249: }
        !           250: 
        !           251:   
        !           252: void CAaaArray::AssertValid() const
        !           253: {
        !           254:        CObject::AssertValid();
        !           255:        if (m_pData == NULL)
        !           256:        {
        !           257:                ASSERT(m_nSize == 0);
        !           258:                ASSERT(m_nMaxSize == 0);
        !           259:        }
        !           260:        else
        !           261:        {
        !           262:                ASSERT(m_nSize <= m_nMaxSize);
        !           263:        }
        !           264: }
        !           265: #endif //_DEBUG
        !           266: #endif // 0
        !           267: /////////////////////////////////////////////////////////////////////////////
        !           268: 

unix.superglobalmegacorp.com

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