hxbitset.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:7k
源码类别:

Symbian

开发平台:

Visual C++

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