TNB Library
TnbBitVector.h
[詳解]
1#pragma once
13#include "TnbCollection.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
39class CBitVector : public ICollectionT<bool>
40{
41 DEFSUPER(ICollectionT<bool>);
42 CVectorT<BYTE> m_vbData;
43 size_t m_dataSize;
44 CSyncSection m_syncFunc;
45 mutable bool m_boTemp;
46
57 static void ms_ShiftRight(INDEX startIndex, BYTE* B, size_t len)
58 {
59 bool boLastBit = false;
60 BYTE bTop = B[startIndex / 8];
61 for ( INDEX i = len - 1; i >= startIndex / 8; i-- )
62 {
63 bool b = (B[i] & _BIT(0)) != 0;
64 B[i] >>= 1;
65 if ( boLastBit )
66 {
67 B[i] |= _BIT(7);
68 }
69 boLastBit = b;
70 }
71 INDEX pos = startIndex & 7;
72 if ( pos != 0 )
73 {
74 BYTE bMask = static_cast<BYTE>(_BIT(pos) - 1);
75 bTop &= bMask;
76 B[startIndex / 8] &= ~bMask;
77 B[startIndex / 8] |= bTop;
78 }
79 }
80
91 static void ms_ShiftLeft(INDEX startIndex, BYTE* B, size_t len)
92 {
93 bool boLastBit = false;
94 BYTE bTop = B[startIndex / 8];
95 for ( INDEX i = startIndex / 8; i < len; i++ )
96 {
97 bool b = (B[i] & _BIT(7)) != 0;
98 B[i] <<= 1;
99 if ( boLastBit )
100 {
101 B[i] |= _BIT(0);
102 }
103 boLastBit = b;
104 }
105 INDEX pos = startIndex & 7;
106 if ( pos != 0 )
107 {
108 BYTE bMask = static_cast<BYTE>(_BIT(pos) - 1);
109 bTop &= bMask;
110 B[startIndex / 8] &= ~bMask;
111 B[startIndex / 8] |= bTop;
112 }
113 }
114
115public:
116
129 class CRef
130 {
131 friend class CBitVector;
132 CBitVector* m_vb;
133 INDEX m_index;
135 CRef(const CBitVector* P, INDEX i)
136 {
137 m_vb = const_cast<CBitVector*>(P);
138 m_index = i;
139 }
140 public:
147 operator bool(void) const
148 {
149 return m_vb->At(m_index);
150 }
158 bool operator=(bool b)
159 {
160 m_vb->Set(m_index, b);
161 return b;
162 }
163 };
164
165
166 //--------------------------------------
167
168
169 #ifndef _TnbDOXYGEN //Document作成用シンボル
170 // const_iterator型宣言
171 typedef CConstIteratorBaseT<CBitVector, bool> const_iterator;
172 // iterator宣言
173 class iterator
174 {
175 _ITERATORCORE(iterator, CBitVector)
176 public:
177 CRef operator*(void)
178 {
179 return (*m_V)[m_ind];
180 }
181 CRef operator[](int i)
182 {
183 return (*m_V)[m_ind+i];
184 }
185 };
186 #endif //_TnbDOXYEM
187
193 const_iterator begin(void) const { return const_iterator(this, 0); }
194
200 const_iterator end(void) const { return const_iterator(this, GetSize()); }
201
207 iterator begin(void) { return iterator(this, 0); }
208
214 iterator end(void) { return iterator(this, GetSize()); }
215
222 iterator insert(iterator ite, bool t = false)
223 {
224 INDEX i = ite.GetIndex();
225 Insert(i, t);
226 return iterator(this, i);
227 }
228
233 void push_front(bool t) { Insert(0, t); }
234
235
236 //------------------------
237
238
245 explicit CBitVector(size_t size = 0) : _super(), m_vbData(size)
246 {
247 m_dataSize = 0;
248 }
249
255 CBitVector(const CBitVector& other) : _super(), m_vbData(other.m_vbData)
256 {
257 m_dataSize = other.m_dataSize;
258 }
259
261 virtual ~CBitVector(void)
262 {
263 }
264
273 {
274 m_vbData = other.m_vbData;
275 m_dataSize = other.m_dataSize;
276 return *this;
277 }
278
287 void SetIncrementSize(size_t size)
288 {
289 m_vbData.SetIncrementSize(size);
290 }
291
300 virtual bool Lock(DWORD dwTime = INFINITE) const
301 {
302 return m_syncFunc.Lock();
303 }
304
306 virtual void Unlock(void) const
307 {
308 m_syncFunc.Unlock();
309 }
310
315 virtual size_t GetSize(void) const
316 {
317 return m_dataSize;
318 }
319
328 virtual const bool& At(INDEX index) const
329 {
330 if ( ! IsInRange(index) )
331 {
333 }
334 m_boTemp = (m_vbData[index / 8] & _BIT(index & 7)) != 0;
335 return m_boTemp;
336 }
337
345 virtual bool& Ref(INDEX index)
346 {
347 throw CNotSupportException();
348 }
349
359 virtual bool Set(INDEX index, const bool& t)
360 {
361 if ( ! IsInRange(index) )
362 {
363 return false;
364 }
365 if ( t )
366 {
367 m_vbData[index / 8] |= _BIT(index & 7);
368 }
369 else
370 {
371 m_vbData[index / 8] &= ~_BIT(index & 7);
372 }
373 return true;
374 }
375
382 virtual INDEX Add(const bool& t)
383 {
384 if ( m_dataSize == 0 || (m_dataSize & 7) == 7 )
385 {
386 m_vbData.Add(0);
387 }
388 if ( t )
389 {
390 m_vbData[m_dataSize / 8] |= _BIT(m_dataSize & 7);
391 }
392 else
393 {
394 m_vbData[m_dataSize / 8] &= ~_BIT(m_dataSize & 7);
395 }
396 return m_dataSize++;
397 }
398
405 virtual bool Remove(INDEX index)
406 {
407 if ( ! IsInRange(index) )
408 {
409 return false;
410 }
411 m_dataSize--;
412 ms_ShiftRight(index, m_vbData.GetBuffer(), m_vbData.GetSize());
413 m_vbData.ReleaseBuffer();
414 return true;
415 }
416
422 virtual bool RemoveAll(void)
423 {
424 m_vbData.RemoveAll();
425 m_dataSize = 0;
426 return true;
427 }
428
437 bool Insert(INDEX index, const bool& t)
438 {
439 if ( index == m_dataSize )
440 {
441 return IsValid(Add(t));
442 }
443 if ( ! IsInRange(index) )
444 {
445 return false;
446 }
447 if ( m_dataSize == 0 || (m_dataSize & 7) == 7 )
448 {
449 m_vbData.Add(0);
450 }
451 ms_ShiftLeft(index, m_vbData.GetBuffer(), m_vbData.GetSize());
452 m_vbData.ReleaseBuffer();
453 if ( t )
454 {
455 m_vbData[index / 8] |= _BIT(index & 7);
456 }
457 else
458 {
459 m_vbData[index / 8] &= ~_BIT(index & 7);
460 }
461 m_dataSize++;
462 return true;
463 }
464
473 const CRef operator[](INDEX index) const
474 {
475 if ( ! IsInRange(index) )
476 {
478 }
479 return CRef(this, index);
480 }
481
490 CRef operator[](INDEX index)
491 {
492 if ( ! IsInRange(index) )
493 {
495 }
496 return CRef(this, index);
497 }
498
499private:
500 friend class CBitVectorTest;
501};
502
503
504
505}; // TNB
506
情報群管理関係のヘッダ
#define _BIT(X)
BIT演算
Definition: TnbDef.h:307
配列型bit情報管理の参照クラス
Definition: TnbBitVector.h:130
bool operator=(bool b)
[設定] データ設定
Definition: TnbBitVector.h:158
配列型bit情報管理テンプレート
Definition: TnbBitVector.h:40
virtual bool Set(INDEX index, const bool &t)
[設定] 要素の設定.
Definition: TnbBitVector.h:359
virtual INDEX Add(const bool &t)
[追加] 要素一つ追加.
Definition: TnbBitVector.h:382
iterator insert(iterator ite, bool t=false)
[反復] 挿入
Definition: TnbBitVector.h:222
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbBitVector.h:315
const_iterator end(void) const
[反復] 最後const_iterator.
Definition: TnbBitVector.h:200
iterator begin(void)
[反復] 先頭iterator.
Definition: TnbBitVector.h:207
CBitVector & operator=(const CBitVector &other)
[代入] コピーオペレータ
Definition: TnbBitVector.h:272
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbBitVector.h:287
virtual bool Remove(INDEX index)
[削除] 要素一つ削除.
Definition: TnbBitVector.h:405
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbBitVector.h:300
CBitVector(const CBitVector &other)
コピーコンストラクタ
Definition: TnbBitVector.h:255
void push_front(bool t)
[反復] 先頭に挿入
Definition: TnbBitVector.h:233
const CRef operator[](INDEX index) const
[取得] 要素の参照取得.
Definition: TnbBitVector.h:473
virtual bool & Ref(INDEX index)
[取得] 要素の参照取得.
Definition: TnbBitVector.h:345
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbBitVector.h:422
virtual ~CBitVector(void)
デストラクタ
Definition: TnbBitVector.h:261
bool Insert(INDEX index, const bool &t)
[追加] 要素一つ挿入
Definition: TnbBitVector.h:437
virtual const bool & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbBitVector.h:328
CRef operator[](INDEX index)
[取得] 要素の参照取得.
Definition: TnbBitVector.h:490
const_iterator begin(void) const
[反復] 先頭const_iterator.
Definition: TnbBitVector.h:193
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbBitVector.h:306
friend class CBitVectorTest
フレンドクラス宣言
Definition: TnbBitVector.h:500
iterator end(void)
[反復] 最後iterator.
Definition: TnbBitVector.h:214
CBitVector(size_t size=0)
コンストラクタ
Definition: TnbBitVector.h:245
INDEX範囲外例外
Definition: TnbException.h:81
サポート外例外
Definition: TnbException.h:185
Section排他管理クラス
Definition: TnbSync.h:125
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:148
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSync.h:155
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
TYP * GetBuffer(size_t size=0)
[操作] データアドレス取得
Definition: TnbVector.h:745
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbVector.h:340
void ReleaseBuffer(void)
[操作] データの管理を元に戻す.
Definition: TnbVector.h:805
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
インプットイテレータ.
ランダムアクセスイテレータ.
CValueAcceleration operator*(const CValueSpeed &s, const CValueFrequency &f)
[計算] 掛算 (加速度 = 速度 × 周波数) .
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理操作インターフェーステンプレート
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.