00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __XNBITSET_H__
00023 #define __XNBITSET_H__
00024
00025 #include <XnArray.h>
00026
00027 class XnBitSet
00028 {
00029 public:
00030 XnBitSet() : m_nSize(0) {}
00031
00034 XnStatus Reserve(XnUInt32 nBits)
00035 {
00036 return m_array.Reserve((nBits >> 5) + 1);
00037 }
00038
00040 XnStatus SetSize(XnUInt32 nBits)
00041 {
00042 return m_array.SetSize((nBits >> 5) + 1, 0);
00043 }
00044
00046 XnStatus Set(XnUInt32 nIndex, XnBool bValue)
00047 {
00048 XnUInt32 nArrayIndex = (nIndex >> 5);
00049 XnUInt32 nMask = (1 << ((~nIndex) & 0x1F));
00050 XnUInt32 nOldVal = nArrayIndex < m_array.GetSize() ? m_array[nArrayIndex] : 0;
00051 XnUInt32 nNewVal = bValue ? (nOldVal | nMask) : (nOldVal & (~nMask));
00052 XnStatus nRetVal = m_array.Set(nArrayIndex, nNewVal, 0);
00053 XN_IS_STATUS_OK(nRetVal);
00054 m_nSize = XN_MAX(m_nSize, nIndex + 1);
00055 return XN_STATUS_OK;
00056 }
00057
00059 XnBool IsSet(XnUInt32 nIndex) const
00060 {
00061 XnUInt32 nArrayIndex = (nIndex >> 5);
00062 if (nArrayIndex >= m_array.GetSize())
00063 {
00064 return FALSE;
00065 }
00066 return (m_array[nArrayIndex] & (1 << ((~nIndex) & 0x1F))) ? TRUE : FALSE;
00067 }
00068
00070 XnStatus SetData(const XnUInt32* pData, XnUInt32 nSizeInDwords)
00071 {
00072 XnStatus nRetVal = m_array.SetData(pData, nSizeInDwords);
00073 XN_IS_STATUS_OK(nRetVal);
00074 m_nSize = (nSizeInDwords << 5);
00075 return XN_STATUS_OK;
00076 }
00077
00079 XnStatus SetDataBytes(const XnUInt8* pData, XnUInt32 nSizeInBytes)
00080 {
00081
00082 XnUInt32 nSizeInDwords = XN_MAX(1, nSizeInBytes >> 2);
00083 XnStatus nRetVal = m_array.SetSize(nSizeInDwords);
00084 XN_IS_STATUS_OK(nRetVal);
00085 for (XnUInt32 nDwordIdx = 0, nByteIdx = 0; nDwordIdx < nSizeInDwords; nDwordIdx++, nByteIdx += 4)
00086 {
00087 m_array[nDwordIdx] = ((pData[nByteIdx] << 24) | (pData[nByteIdx + 1] << 16) | (pData[nByteIdx + 2] << 8) | pData[nByteIdx + 3] );
00088 }
00089 m_nSize = (nSizeInBytes << 3);
00090 return XN_STATUS_OK;
00091 }
00092
00094 const XnUInt32* GetData() const
00095 {
00096 return m_array.GetData();
00097 }
00098
00100 XnUInt32* GetData()
00101 {
00102 return m_array.GetData();
00103 }
00104
00106 XnUInt32 GetDataSize() const
00107 {
00108 return m_array.GetSize();
00109 }
00110
00112 XnUInt32 GetSize() const
00113 {
00114 return m_nSize;
00115 }
00116
00118 void Clear()
00119 {
00120 m_array.Clear();
00121 m_nSize = 0;
00122 }
00123
00125 XnBool IsEmpty() const
00126 {
00127 return m_array.IsEmpty();
00128 }
00129
00130 private:
00131 XnArray<XnUInt32> m_array;
00132 XnUInt32 m_nSize;
00133 };
00134
00135 #endif // __XNBITSET_H__