TNB Library
TnbSet.h
[詳解]
1#pragma once
16#include "TnbCollection.h"
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
69template<typename TYP>
70class CSingleSetT : public IConstCollectionT<TYP>, public ISequenceCollectionT<TYP>
71{
72public:
73
80 explicit CSingleSetT(size_t size = 0) : m_data(size)
81 {
82 }
83
90 {
91 m_data = other.m_data;
92 }
93
102 {
103 m_data = other.m_data;
104 return *this;
105 }
106
115 virtual bool Lock(DWORD dwTime = INFINITE) const
116 {
117 return m_data.Lock(dwTime);
118 }
119
121 virtual void Unlock(void) const
122 {
123 m_data.Unlock();
124 }
125
133 virtual const TYP* ReferBuffer(void) const
134 {
135 return m_data.ReferBuffer();
136 }
137
142 virtual size_t GetSize(void) const
143 {
144 return m_data.GetSize();
145 }
146
155 virtual const TYP& At(INDEX index) const
156 {
157 return m_data[index];
158 }
159
168 const TYP& operator[](INDEX index) const
169 {
170 return m_data.At(index);
171 }
172
181 bool Remove(INDEX index)
182 {
183 return m_data.Remove(index);
184 }
185
192 virtual bool RemoveAll(void)
193 {
194 return m_data.RemoveAll();
195 }
196
204 bool Delete(const TYP& t)
205 {
206 INDEX i = GetEqualIndex(t);
207 if ( i != INVALID_INDEX )
208 {
209 return m_data.Remove(i);
210 }
211 return false;
212 }
213
220 bool Has(const TYP& t) const
221 {
222 return GetEqualIndex(t) != INVALID_INDEX;
223 }
224
232 INDEX GetEqualIndex(const TYP& t) const
233 {
234 if ( IsEmpty() )
235 {
236 return INVALID_INDEX;
237 }
238 size_t sz = m_data.GetSize();
239 if ( t < m_data[0] || m_data[sz - 1] < t )
240 {
241 return INVALID_INDEX;
242 }
243 INDEX f = 0;
244 INDEX z = sz;
245 while ( z > 0 )
246 {
247 INDEX x = z / 2;
248 if ( m_data[f + x] < t )
249 {
250 // 大きい
251 f += (x + 1);
252 z = (z - 1) / 2;
253 }
254 else if ( t < m_data[f + x] )
255 {
256 // 小さい
257 z /= 2;
258 }
259 else
260 {
261 return f + x;
262 }
263 }
264 return INVALID_INDEX;
265 }
266
273 INDEX Insert(const TYP& t)
274 {
275 INDEX r = m_Insert(t);
276 #ifdef _DEBUG
277 if ( r != INVALID_INDEX )
278 {
279 if ( r >= 1 )
280 {
281 ASSERT( ! (t < At(r - 1)) );
282 }
283 if ( r + 1 < GetSize() )
284 {
285 ASSERT( ! (At(r + 1) < t) );
286 }
287 }
288 #endif
289 return r;
290 }
291
298 INDEX InsertEx(const TYP& t)
299 {
300 EXCLUSIVE( this );
301 return Insert(t);
302 }
303
311 {
312 EXCLUSIVE( this );
313 loop ( i, t.GetSize() )
314 {
315 if ( Insert(t.At(i)) == INVALID_INDEX )
316 {
317 return false;
318 }
319 }
320 return true;
321 }
322
330 size_t InsertElements(size_t size, const TYP* P)
331 {
332 EXCLUSIVE( this );
333 size_t cnt = 0;
334 loop ( i, size )
335 {
336 if ( ! Has(*P) )
337 {
338 if ( Insert(*P) == INVALID_INDEX )
339 {
340 return INVALID_SIZE;
341 }
342 cnt++;
343 }
344 P++;
345 }
346 return cnt;
347 }
348
349protected:
355 virtual INDEX OnFoundEqual(INDEX index)
356 {
357 return index;
358 }
359
361
362private:
369 INDEX m_Insert(const TYP& t)
370 {
371 if ( IsEmpty() )
372 {
373 return m_data.Add(t);
374 }
375 size_t sz = m_data.GetSize();
376 if ( t < m_data[0] )
377 {
378 m_data.Insert(0, t);
379 return 0;
380 }
381 if ( m_data[sz - 1] < t )
382 {
383 return m_data.Add(t);
384 }
385 INDEX f = 0;
386 INDEX z = sz;
387 while ( z > 0 )
388 {
389 INDEX x = z / 2;
390 if ( m_data[f + x] < t )
391 {
392 // 大きい
393 f += (x + 1);
394 z = (z - 1) / 2;
395 }
396 else if ( t < m_data[f + x] )
397 {
398 // 小さい
399 z /= 2;
400 }
401 else
402 {
403 // 同じ値発見
404 m_data[f + x] = t;
405 return OnFoundEqual(f + x);
406 }
407 }
408 if ( m_data[f] < t )
409 {
410 f++;
411 }
412 m_data.Insert(f, t);
413 return f;
414 }
415 friend class CSetTest;
416};
417
418
419
420#if 0
421
438template<typename TYP>
439class CMultiSetT : public CSingleSetT<TYP>
440{
441public:
442
449 INDEX Insert(const TYP& v)
450 {
451 loop ( i, m_data.GetSize() )
452 {
453 if ( v < m_data[i] || ! (m_data[i] < v) )
454 {
455 //その要素より小さいか同じ
456 m_data.Insert(i, v);
457 return i;
458 }
459 }
460 m_data.Add(v);
461 return m_data.GetSize() - 1;
462 }
463
471 bool Delete(const TYP& t)
472 {
473 TRange r = GetEqualRange(t);
474 if ( r.lower != INVALID_INDEX )
475 {
476 m_data.RemoveElement(r.lower, (r.upper - r.lower) + 1);
477 return true;
478 }
479 return false;
480 }
481
482 struct TRange
483 {
484 INDEX lower;
485 INDEX upper;
486 };
487
494 TRange GetEqualRange(const TYP& v) const
495 {
496 TRange r = { INVALID_INDEX, INVALID_INDEX };
497 size_t sz = m_data.GetSize();
498 for ( INDEX i = 0; i < sz; i++ )
499 {
500 if ( m_IsEqual(v, m_data[i]) )
501 {
502 //同じ
503 r.lower = i;
504 i++;
505 for ( ; i < sz; i++ )
506 {
507 if ( v < m_data[i] || m_data[i] < v )
508 {
509 r.upper = i - 1;
510 break;
511 }
512 }
513 break;
514 }
515 }
516 return r;
517 }
525 bool m_IsEqual(const TYP& t1, const TYP& t2) const
526 {
527 return ! (t1 < t2) && ! (t2 < t1);
528 }
529
530};
531
532#endif
533
534
535
536}; //TNB
情報群管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
シングルセット情報管理テンプレート
Definition: TnbSet.h:71
bool Insert(const IConstCollectionT< TYP > &t)
[検索] 指定要素挿入.
Definition: TnbSet.h:310
virtual size_t GetSize(void) const
[取得] 要素数取得.
Definition: TnbSet.h:142
virtual INDEX OnFoundEqual(INDEX index)
[通知] 同じ値発見通知.
Definition: TnbSet.h:355
CSingleSetT(size_t size=0)
コンストラクタ
Definition: TnbSet.h:80
bool Has(const TYP &t) const
[確認] 値あるか?
Definition: TnbSet.h:220
bool Delete(const TYP &t)
[削除] 指定要素の削除.
Definition: TnbSet.h:204
bool Remove(INDEX index)
[削除] 要素一つ削除.
Definition: TnbSet.h:181
CVectorT< TYP > m_data
データ
Definition: TnbSet.h:360
INDEX GetEqualIndex(const TYP &t) const
[検索] 指定要素の検索.
Definition: TnbSet.h:232
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbSet.h:155
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSet.h:115
const TYP & operator[](INDEX index) const
[取得] 要素の参照取得.
Definition: TnbSet.h:168
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbSet.h:192
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得.
Definition: TnbSet.h:133
CSingleSetT & operator=(const CSingleSetT &other)
[代入] 代入
Definition: TnbSet.h:101
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSet.h:121
INDEX Insert(const TYP &t)
[検索] 指定要素挿入.
Definition: TnbSet.h:273
size_t InsertElements(size_t size, const TYP *P)
[検索] 指定要素挿入.
Definition: TnbSet.h:330
CSingleSetT(const CSingleSetT< TYP > &other)
コピーコンストラクタ
Definition: TnbSet.h:89
INDEX InsertEx(const TYP &t)
[検索] 指定要素挿入.
Definition: TnbSet.h:298
配列型情報管理テンプレート
Definition: TnbVector.h:75
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理インターフェーステンプレート
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.
連続メモリ配置型情報群管理インターフェーステンプレート