hxbitset.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/string.h"
  36. #include "debug.h"
  37. #include "hxassert.h"
  38. #include "hxtypes.h"
  39. #include "hxbitset.h"
  40. #include "hxheap.h"
  41. #ifdef _DEBUG
  42. #undef HX_THIS_FILE
  43. static const char HX_THIS_FILE[] = __FILE__;
  44. #endif
  45. CHXBitset::CHXBitset():
  46.     m_nBitsetSize(_BS_SHORT_LEN),
  47.     m_pBitset(m_pShortBitset)
  48. {
  49.     memset(m_pShortBitset, 0, HX_SAFESIZE_T(sizeof(_BS_word) * _BS_SHORT_LEN));
  50. }
  51. CHXBitset::CHXBitset(INT32 maxBit):
  52.     m_nBitsetSize(0),
  53.     m_pBitset(m_pShortBitset)
  54. {
  55.     HX_ASSERT(maxBit > 0);
  56.     setBitsetSize(_BS_WORDS_NEEDED(maxBit));
  57.     clear();
  58. }
  59. CHXBitset::CHXBitset(BYTE* pBitmap, INT32 nCount):
  60.     m_nBitsetSize(0),
  61.     m_pBitset(m_pShortBitset)
  62. {
  63.     if (nCount <= 0)
  64.     {
  65.         return;
  66.     }
  67.     setBitsetSize((nCount / 4) + 1); //setBitsetSize also clears the bitset
  68.     INT32 i, j;
  69.     for(i=0, j=0; i<m_nBitsetSize; ++i, j+=4)
  70.     {
  71. if(nCount - j > 3)
  72. {
  73.     m_pBitset[i] = pBitmap[j+3] _BS_LEFT 24 |
  74.    pBitmap[j+2] _BS_LEFT 16 |
  75.    pBitmap[j+1] _BS_LEFT 8 |
  76.    pBitmap[j];
  77. }
  78. else if(nCount - j > 2)
  79. {
  80.     m_pBitset[i] = pBitmap[j+2] _BS_LEFT 24 |
  81.    pBitmap[j+1] _BS_LEFT 16 |
  82.    pBitmap[j] _BS_LEFT 8;
  83. }
  84. else if(nCount - j > 1)
  85. {
  86.     m_pBitset[i] = pBitmap[j+1] _BS_LEFT 24 |
  87.    pBitmap[j] _BS_LEFT 16;
  88. }
  89. else if(nCount - j > 0)
  90. {
  91.     m_pBitset[i] = pBitmap[j] _BS_LEFT 24;
  92. }
  93.     }
  94. }
  95. CHXBitset::~CHXBitset()
  96. {
  97.     if (m_pBitset != m_pShortBitset)
  98.     {
  99.         delete[] m_pBitset;
  100.     }
  101. }
  102. void
  103. CHXBitset::set(INT32 pos)
  104. {
  105.     HX_ASSERT(pos >= 0);
  106.     setBitsetSize(_BS_WORDS_NEEDED(pos+1));
  107.     INT32 idx = _BS_INDEX(pos);
  108.     m_pBitset[idx] |= _BS_BITMASK(_BS_POS(pos));
  109. }
  110. void
  111. CHXBitset::set(INT32 from, INT32 to)
  112. {
  113.     HX_ASSERT(from >= 0);
  114.     for(INT32 i=from; i<to; ++i)
  115.     {
  116. set(i);
  117.     }
  118. }
  119. void
  120. CHXBitset::set()
  121. {
  122.     memset(m_pBitset, 0xff, HX_SAFESIZE_T(sizeof(_BS_word)*(m_nBitsetSize)));
  123. }
  124. void
  125. CHXBitset::clear(INT32 pos)
  126. {
  127.     HX_ASSERT(pos >= 0);
  128.     INT32 idx = _BS_INDEX(pos);
  129.     HX_ASSERT(idx < m_nBitsetSize);
  130.     m_pBitset[idx] &= ~(_BS_BITMASK(_BS_POS(pos)));
  131. }
  132. void
  133. CHXBitset::clear(INT32 from, INT32 to)
  134. {
  135.     HX_ASSERT(from >= 0);
  136.     for(INT32 i=from; i<to; ++i)
  137.     {
  138. clear(i);
  139.     }
  140. }
  141. void
  142. CHXBitset::clear()
  143. {
  144.     if (m_nBitsetSize == 0)
  145. return;
  146.     memset(m_pBitset, 0, HX_SAFESIZE_T(sizeof(_BS_word)*m_nBitsetSize));
  147. }
  148. BOOL
  149. CHXBitset::test(INT32 pos)
  150. {
  151.     HX_ASSERT(pos >= 0);
  152.     INT32 idx = _BS_INDEX(pos);
  153.     HX_ASSERT(idx < m_nBitsetSize);
  154.     if (!(idx < m_nBitsetSize))
  155.     {
  156. // changed %d to %ld for long int (WIN16 condsideration)
  157. // as all values are INT32
  158. DPRINTF(D_INFO, ("test failure %ld %ld %ldn", pos, idx, m_nBitsetSize));
  159.     }
  160.     return (m_pBitset[idx] & _BS_BITMASK(_BS_POS(pos))) != 0;
  161. }
  162. INT32
  163. CHXBitset::toByteArray(BYTE** pBitmap)
  164. {
  165.     INT32 nCount = m_nBitsetSize * 4;
  166.     if (nCount == 0)
  167.     {
  168.         return 0;
  169.     }
  170.     *pBitmap = new BYTE[nCount];
  171.     INT32 i,j;
  172.     for(i=0, j=0; i<m_nBitsetSize; ++i, j+=4)
  173.     {
  174. (*pBitmap)[j+3] = (BYTE)((m_pBitset[i] _BS_RIGHT 24) & 0xffff);
  175. (*pBitmap)[j+2] = (BYTE)((m_pBitset[i] _BS_RIGHT 16) & 0xffff);
  176. (*pBitmap)[j+1] = (BYTE)((m_pBitset[i] _BS_RIGHT 8) & 0xffff);
  177. (*pBitmap)[j] = (BYTE)(m_pBitset[i] & 0xffff);
  178.     }
  179.     return nCount;
  180. }
  181. BOOL
  182. CHXBitset::test(INT32 from, INT32 to)
  183. {
  184.     HX_ASSERT(from >= 0);
  185.     for(INT32 i=from; i<to; ++i)
  186.     {
  187. if (!test(i))
  188.     return(FALSE);
  189.     }
  190.     return(TRUE);
  191. }
  192. void
  193. CHXBitset::growsize(INT32 maxBit)
  194. {
  195.     setBitsetSize(_BS_WORDS_NEEDED(maxBit+1));
  196. }
  197. void
  198. CHXBitset::setBitsetSize(INT32 nBitsetSize)
  199. {
  200.     if (nBitsetSize > m_nBitsetSize)
  201.     {
  202.         if (nBitsetSize > _BS_SHORT_LEN)
  203.         {
  204.             _BS_word* pTempBitset = new _BS_word[nBitsetSize];
  205.             memcpy(pTempBitset, m_pBitset, m_nBitsetSize); /* Flawfinder: ignore */
  206.             memset(&(pTempBitset[m_nBitsetSize]), 0,
  207.                    HX_SAFESIZE_T(sizeof(_BS_word) * (nBitsetSize - m_nBitsetSize)));
  208.             if (m_pBitset != m_pShortBitset)
  209.             {
  210.                 delete[] m_pBitset;
  211.             }
  212.             m_pBitset = pTempBitset;
  213.             m_nBitsetSize = nBitsetSize;
  214.         }
  215.         else
  216.         {
  217.             if (m_nBitsetSize == 0)
  218.             {
  219.                 memset(m_pShortBitset, 0, HX_SAFESIZE_T(sizeof(_BS_word) * _BS_SHORT_LEN));
  220.             }
  221.             m_nBitsetSize = nBitsetSize;
  222.         }
  223.     }
  224. }