TNB Library
TnbMap.h
[詳解]
1#pragma once
14#include "TnbPair.h"
15#include "TnbVector.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
64template<typename KEY, typename VAL, typename INK=KEY>
65class CMapT : public ICollectionT<TNB::CPairT<KEY,VAL> >
66{
68 DEFSUPER(_super);
69public:
70
72
94 {
95 DEFSUPER(IConstCollectionT<KEY>);
96 const CMapT* m_pMap;
97 public:
102 CConstKeysAdapter(const CMapT* map) : _super(), m_pMap(map) {}
111 virtual bool Lock(DWORD dwTime = INFINITE) const
112 {
113 return m_pMap->Lock();
114 }
116 virtual void Unlock(void) const
117 {
118 m_pMap->Unlock();
119 }
124 virtual size_t GetSize(void) const
125 {
126 return m_pMap->GetSize();
127 }
136 virtual const KEY& At(INDEX index) const
137 {
138 return m_pMap->At(index).first;
139 }
140 };
141
163 {
164 DEFSUPER(IConstCollectionT<VAL>);
165 const CMapT* m_pMap;
166 public:
171 CConstValuesAdapter(const CMapT* map) : _super(), m_pMap(map) {}
180 virtual bool Lock(DWORD dwTime = INFINITE) const
181 {
182 return m_pMap->Lock();
183 }
185 virtual void Unlock(void) const
186 {
187 m_pMap->Unlock();
188 }
193 virtual size_t GetSize(void) const
194 {
195 return m_pMap->GetSize();
196 }
205 virtual const VAL& At(INDEX index) const
206 {
207 return m_pMap->At(index).second;
208 }
209 };
210
211private:
212
213 CVectorT< CPair > m_vPair;
214
221 const VAL* m_SearchKey(INK key) const
222 {
223 const CPair* P = m_vPair.ReferBuffer();
224 if ( P != NULL )
225 {
226 loop ( i, m_vPair.GetSize() )
227 {
228 if ( P[i].first == key )
229 {
230 return &(P[i].second);
231 }
232 }
233 }
234 return NULL;
235 }
236
243 VAL* m_SearchKey(INK key)
244 {
245 loop ( i, m_vPair.GetSize() )
246 {
247 if ( m_vPair[i].first == key )
248 {
249 return &(m_vPair[i].second);
250 }
251 }
252 return NULL;
253 }
254
255public:
256
263 explicit CMapT(size_t size = 0) : _super(), m_vPair(size)
264 {
265 }
266
271 CMapT(const CMapT& map) : _super(), m_vPair(map.m_vPair)
272 {
273 }
274
276 virtual ~CMapT(void)
277 {
278 }
279
285 CMapT& operator=(const CMapT& other)
286 {
287 m_vPair = other.m_vPair;
288 return *this;
289 }
290
299 virtual bool Lock(DWORD dwTime = INFINITE) const
300 {
301 return m_vPair.Lock();
302 }
303
305 virtual void Unlock(void) const
306 {
307 m_vPair.Unlock();
308 }
309
318 void SetIncrementSize(size_t size)
319 {
320 m_vPair.SetIncrementSize(size);
321 }
322
327 virtual size_t GetSize(void) const
328 {
329 return m_vPair.GetSize();
330 }
331
341 virtual CPair Get(INDEX index) const
342 {
343 return m_vPair.Get(index);
344 }
345
354 virtual const CPair& At(INDEX index) const
355 {
356 return m_vPair.At(index);
357 }
358
367 virtual CPair& Ref(INDEX index)
368 {
369 return m_vPair.Ref(index);
370 }
371
381 virtual bool Set(INDEX index, const CPair& t)
382 {
383 return m_vPair.Set(index, t);
384 }
385
392 virtual INDEX Add(const CPair& t)
393 {
394 SetKey(t.first, t.second);
395 return 0;
396 }
397
406 virtual size_t Append(const IConstCollectionT<CPair>& c)
407 {
408 EXCLUSIVE2(&c, this);
409 loop ( i, c )
410 {
411 RemoveKey(c.At(i).first);
412 }
413 return _super::Append(c);
414 }
415
425 virtual bool Remove(INDEX index)
426 {
427 return m_vPair.Remove(index);
428 }
429
434 virtual bool RemoveAll(void)
435 {
436 return m_vPair.RemoveAll();
437 }
438
444 virtual bool SetSize(size_t size)
445 {
446 return false;
447 }
448
455 void SetKey(INK key, const VAL& newValue)
456 {
457 EXCLUSIVE(this);
458 operator[](key) = newValue;
459 }
460
469 VAL& operator[](INK key)
470 {
471 VAL* P = m_SearchKey(key);
472 if ( P == NULL )
473 {
474 CPair t;
475 t.first = key;
476 m_vPair.Add(t);
477 P = m_SearchKey(key);
478 }
479 return *P;
480 }
481
491 const VAL& operator[](INK key) const
492 {
493 const VAL* P = m_SearchKey(key);
494 if ( P == NULL ){ throw CEmptyException(); }
495 return *P;
496 }
497
504 bool RemoveKey(INK key)
505 {
506 EXCLUSIVE(this);
507 const CPair* P = m_vPair.ReferBuffer();
508 loop ( i, m_vPair.GetSize() )
509 {
510 if ( P[i].first == key )
511 {
512 m_vPair.Remove(i);
513 return true;
514 }
515 }
516 return false;
517 }
518
526 const VAL* GetValuePtr(INK key) const
527 {
528 EXCLUSIVE(this);
529 return m_SearchKey(key);
530 }
531
539 VAL* GetValuePtr(INK key)
540 {
541 EXCLUSIVE(this);
542 return m_SearchKey(key);
543 }
544
554 bool Get(INDEX index, KEY& _rKey, VAL& _rValue) const
555 {
556 EXCLUSIVE(this);
557 if ( ! TNB::IsInRange(index, m_vPair.GetSize()) )
558 {
559 return false;
560 }
561 const CPair* P = m_vPair.ReferBuffer();
562 _rKey = P[index].first;
563 _rValue = P[index].second;
564 return true;
565 }
566
574 bool Lookup(INK key, VAL& _rValue) const
575 {
576 EXCLUSIVE(this);
577 const VAL* P = m_SearchKey(key);
578 if ( P == NULL ){ return false; }
579 _rValue = *P;
580 return true;
581 }
582
589 bool HasKey(INK key) const
590 {
591 EXCLUSIVE(this);
592 return m_SearchKey(key) != NULL;
593 }
594
600 {
601 EXCLUSIVE(this);
603 v.Copy(GetKeysAdapter());
604 return v;
605 }
606
614 virtual bool IsEqual(const IConstCollectionT<TNB::CPairT<KEY,VAL> >& c) const
615 {
616 if ( this == &c )
617 {
618 return true;
619 }
620 EXCLUSIVE2(&c, this);
621 size_t size = GetSize();
622 if ( size != c.GetSize() )
623 {
624 return false;
625 }
627 loop ( i, size )
628 {
629 const KEY& k = c.At(i).first;
630 const VAL* p = GetValuePtr(k);
631 if ( p == NULL )
632 {
633 return false;
634 }
635 const VAL& v = c.At(i).second;
636 if ( ! comparator.IsEqualTo(v, *p) )
637 {
638 return false;
639 }
640 }
641 return true;
642 }
643
650 {
651 return CConstKeysAdapter(this);
652 }
653
660 {
661 return CConstValuesAdapter(this);
662 }
663
664private:
665 friend class CMapTest;
666};
667
668
669
677
685
686
687
688}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ペア型関係のヘッダ
配列型情報管理関係のヘッダ
取得要素(空き)無し例外
Definition: TnbException.h:107
マップ型情報のキーのみ参照アダプタクラス
Definition: TnbMap.h:94
virtual size_t GetSize(void) const
[取得] 要素数取得
Definition: TnbMap.h:124
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbMap.h:111
virtual const KEY & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbMap.h:136
CConstKeysAdapter(const CMapT *map)
コンストラクタ
Definition: TnbMap.h:102
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbMap.h:116
マップ型情報の値のみ参照アダプタクラス
Definition: TnbMap.h:163
virtual size_t GetSize(void) const
[取得] 要素数取得
Definition: TnbMap.h:193
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbMap.h:180
virtual const VAL & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbMap.h:205
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbMap.h:185
CConstValuesAdapter(const CMapT *map)
コンストラクタ
Definition: TnbMap.h:171
マップ型情報管理テンプレート
Definition: TnbMap.h:66
virtual CPair & Ref(INDEX index)
[取得] 要素の参照取得.
Definition: TnbMap.h:367
CConstKeysAdapter GetKeysAdapter(void) const
[取得] キーのみの参照アダプタ取得.
Definition: TnbMap.h:649
virtual size_t GetSize(void) const
[取得] 要素数取得
Definition: TnbMap.h:327
bool RemoveKey(INK key)
[削除] キーと値を削除
Definition: TnbMap.h:504
friend class CMapTest
フレンドクラス宣言
Definition: TnbMap.h:665
virtual bool Set(INDEX index, const CPair &t)
[設定] 要素の設定.
Definition: TnbMap.h:381
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbMap.h:318
VAL & operator[](INK key)
[取得] キーに対する値の参照
Definition: TnbMap.h:469
CMapT(size_t size=0)
コンストラクタ
Definition: TnbMap.h:263
virtual bool Remove(INDEX index)
[削除] キーと値一つ削除.
Definition: TnbMap.h:425
const VAL & operator[](INK key) const
[取得] キーに対する値の参照
Definition: TnbMap.h:491
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbMap.h:299
void SetKey(INK key, const VAL &newValue)
[設定] キーに対する値設定
Definition: TnbMap.h:455
TNB::CPairT< KEY, VAL > CPair
ペア型 定義
Definition: TnbMap.h:71
bool Get(INDEX index, KEY &_rKey, VAL &_rValue) const
[取得] キーと値を取得.
Definition: TnbMap.h:554
CConstValuesAdapter GetValuesAdapter(void) const
[取得] 値のみの参照アダプタ取得.
Definition: TnbMap.h:659
CVectorT< KEY > EnumKeys(void) const
[取得] キーの一覧
Definition: TnbMap.h:599
virtual const CPair & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbMap.h:354
virtual bool SetSize(size_t size)
[操作] サイズ指定.
Definition: TnbMap.h:444
virtual bool RemoveAll(void)
[削除] すべてのキーと値を削除
Definition: TnbMap.h:434
virtual size_t Append(const IConstCollectionT< CPair > &c)
[追加] 追加.
Definition: TnbMap.h:406
virtual ~CMapT(void)
デストラクタ
Definition: TnbMap.h:276
CMapT(const CMapT &map)
コピーコンストラクタ
Definition: TnbMap.h:271
bool HasKey(INK key) const
[確認] キー有無
Definition: TnbMap.h:589
const VAL * GetValuePtr(INK key) const
[取得] 値アドレス取得.
Definition: TnbMap.h:526
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbMap.h:305
virtual INDEX Add(const CPair &t)
[追加] キーと値追加.
Definition: TnbMap.h:392
CMapT & operator=(const CMapT &other)
[代入] コピーオペレータ
Definition: TnbMap.h:285
bool Lookup(INK key, VAL &_rValue) const
[取得] キーに対する値取得
Definition: TnbMap.h:574
virtual bool IsEqual(const IConstCollectionT< TNB::CPairT< KEY, VAL > > &c) const
[確認] 比較.
Definition: TnbMap.h:614
VAL * GetValuePtr(INK key)
[取得] 値アドレス取得.
Definition: TnbMap.h:539
virtual CPair Get(INDEX index) const
[取得] キーと値を取得.
Definition: TnbMap.h:341
ペア型テンプレートクラス
Definition: TnbPair.h:41
FIRST first
一つ目の型の値
Definition: TnbPair.h:44
SECOND second
二つ目の型の値
Definition: TnbPair.h:45
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
Definition: TnbVector.h:220
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbVector.h:340
virtual bool Remove(INDEX index)
[削除] 要素一つ削除.
Definition: TnbVector.h:397
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:233
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbVector.h:353
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
Definition: TnbVector.h:246
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbVector.h:359
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
Definition: TnbVector.h:265
TNB::CMapT< CStr, CStr, LPCTSTR > CStrsMap
文字文字マップクラス.
Definition: TnbMap.h:676
TNB::CMapT< CAscii, CAscii, LPCSTR > CAsciisMap
文字文字マップクラス.
Definition: TnbMap.h:684
#define EXCLUSIVE2(CLS1, CLS2)
簡易排他ツイン制御マクロ.
Definition: TnbSync.h:820
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
bool IsInRange(INDEX value, size_t size)
[確認] 範囲チェック.
Definition: TnbDef.h:421
TNB Library
Definition: TnbDoxyTitle.txt:2
情報群管理操作インターフェーステンプレート
virtual size_t Copy(const IConstCollectionT< TYP > &c)
[設定] コピー.
virtual size_t Append(const IConstCollectionT< TNB::CPairT< KEY, VAL > > &c)
[追加] 追加.
コンパレータインターフェース.
Definition: TnbComparator.h:46
static IComparatorT & GetDefault(void)
[作成] 汎用コンパレータ取得.
virtual bool IsEqualTo(const TYP &t1, const TYP &t2) const
[確認] 比較
Definition: TnbComparator.h:67
情報群管理インターフェーステンプレート
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.