TNB Library
TnbCollectionAdapter.h
[詳解]
1#pragma once
13#include "TnbCollection.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
39template<typename TYP>
41{
42 DEFSUPER(IConstCollectionT<TYP>);
43protected:
44
46 size_t m_size;
47
48public:
49
55 : _super(), m_pCol(c), m_size(0)
56 {
57 }
58
67 virtual bool Lock(DWORD dwTime = INFINITE) const
68 {
69 return m_pCol->Lock();
70 }
71
73 virtual void Unlock(void) const
74 {
75 m_pCol->Unlock();
76 }
77
82 virtual size_t GetSize(void) const
83 {
84 return m_size;
85 }
86
93 {
94 m_pCol = other.m_pCol;
95 m_size = other.m_size;
96 return *this;
97 }
98};
99
100
101
122template<typename TYP>
124{
125 DEFSUPER(CAbstractAdapterT<TYP>);
126 INDEX m_startIndex;
127public:
128
136 CConstOffsetAdapterT(const IConstCollectionT<TYP>* c, INDEX startIndex, size_t size = INVALID_SIZE)
137 : _super(c), m_startIndex(startIndex)
138 {
139 _super::m_size = size;
140 }
141
146 virtual size_t GetSize(void) const
147 {
148 size_t l = m_pCol->GetSize() - m_startIndex;
149 if ( _super::m_size != INVALID_SIZE && l > _super::m_size)
150 {
151 l = _super::m_size;
152 }
153 return l;
154 }
155
164 virtual const TYP& At(INDEX index) const
165 {
166 return m_pCol->At(index + m_startIndex);
167 }
168};
169
170
171
192template<typename TYP>
194{
195 DEFSUPER(CAbstractAdapterT<TYP>);
196public:
197
202 explicit CConstReverseAdapterT(const IConstCollectionT<TYP>* c) : _super(c)
203 {
204 _super::m_size = c->GetSize();
205 }
206
215 virtual const TYP& At(INDEX index) const
216 {
217 return m_pCol->At(_super::m_size - index - 1);
218 }
219};
220
221
222
240template<typename TYP>
242{
243 DEFSUPER(CAbstractAdapterT<TYP>);
244 const IConstCollectionT<TYP>* m_p2ndCol;
245 size_t m_sizeCol;
246public:
247
254 : _super(c1), m_p2ndCol(c2)
255 {
256 m_sizeCol = m_pCol->GetSize();
257 _super::m_size = m_sizeCol + m_p2ndCol->GetSize();
258 }
259
268 virtual bool Lock(DWORD dwTime = INFINITE) const
269 {
270 return m_pCol->Lock() && m_p2ndCol->Lock();
271 }
272
274 virtual void Unlock(void) const
275 {
276 m_p2ndCol->Unlock();
277 m_pCol->Unlock();
278 }
279
288 virtual const TYP& At(INDEX index) const
289 {
290 return (index < m_sizeCol) ? m_pCol->At(index) : m_p2ndCol->At(index - m_sizeCol);
291 }
292};
293
294
295
318template<typename TYP>
319class COffsetAdapterT : public ICollectionT<TYP>
320{
321 DEFSUPER(ICollectionT<TYP>);
322 ICollectionT<TYP>* m_pCol;
323 INDEX m_startIndex;
324 size_t m_size;
325public:
326
334 COffsetAdapterT(ICollectionT<TYP>* c, INDEX startIndex, size_t size = 0)
335 : _super(), m_pCol(c), m_startIndex(startIndex), m_size(size)
336 {
337 }
338
347 virtual bool Lock(DWORD dwTime = INFINITE) const
348 {
349 return m_pCol->Lock();
350 }
351
353 virtual void Unlock(void) const
354 {
355 m_pCol->Unlock();
356 }
357
362 virtual size_t GetSize(void) const
363 {
364 size_t l = m_pCol->GetSize() - m_startIndex;
365 return TNB::IsInRange(m_size, l) ? m_size : l;
366 }
367
376 virtual const TYP& At(INDEX index) const
377 {
378 return m_pCol->At(index + m_startIndex);
379 }
380
390 virtual TYP& Ref(INDEX index)
391 {
392 return m_pCol->Ref(index + m_startIndex);
393 }
394
404 virtual bool Set(INDEX index, const TYP& t)
405 {
406 return m_pCol->Set(index + m_startIndex, t);
407 }
408
415 virtual INDEX Add(const TYP& t)
416 {
417 return INVALID_INDEX;
418 }
419
426 virtual bool Remove(INDEX index)
427 {
428 return false;
429 }
430
437 virtual void Swap(INDEX index1, INDEX index2)
438 {
439 m_pCol->Swap(index1 + m_startIndex, index2 + m_startIndex);
440 }
441};
442
443
444
470template<typename TYP>
472{
473 DEFSUPER(IConstCollectionT<TYP>);
474 const TYP* m_pcType;
475 size_t m_size;
476public:
477
478 #ifndef _TnbDOXYGEN //Document作成用シンボル
479 // const_iterator型宣言
480 typedef const TYP* const_iterator;
481 #endif //_TnbDOXYEM
482
488 const_iterator begin(void) const { return m_pcType; }
489
495 const_iterator end(void) const { return m_pcType + m_size; }
496
502 CConstAdapterT(size_t size, LPCVOID P)
503 : _super(), m_pcType(static_cast<const TYP*>(P)), m_size(size)
504 {
505 }
506
512 virtual bool Lock(DWORD dwTime = INFINITE) const
513 {
514 return true;
515 }
516
518 virtual void Unlock(void) const
519 {
520 }
521
526 virtual size_t GetSize(void) const
527 {
528 return m_size;
529 }
530
538 virtual const TYP* ReferBuffer(void) const
539 {
540 return m_pcType;
541 }
542
549 virtual const TYP& At(INDEX index) const
550 {
551 if ( ! IsInRange(index) ){ throw CIndexOutOfBoundsException(); }
552 return m_pcType[index];
553 }
554
563 const TYP& operator[](INDEX index) const
564 {
565 return At(index);
566 }
567
574 {
575 m_pcType = other.m_pcType;
576 m_size = other.m_size;
577 return *this;
578 }
579};
580
581
582
606template<typename TYP>
608{
609 DEFSUPER(IConstCollectionT<TYP>);
610
611 #ifndef _TnbDOXYGEN //Document作成用シンボル
612
613 // memo; ICollectionT の sort を使用するためにインナークラスを作成している。
614 struct TParam : ICollectionT<TYP>
615 {
616 DEFSUPER(ICollectionT<TYP>);
617 const IConstCollectionT<TYP>* m_pCol;
618 INDEX* m_pIndexs;
619 size_t m_size;
620 // ロック
621 virtual bool Lock(DWORD dwTime = INFINITE) const { return m_pCol->Lock(); }
622 // アンロック
623 virtual void Unlock(void) const { m_pCol->Unlock(); }
624 // 要素数取得
625 virtual size_t GetSize(void) const { return m_size; }
626 // 要素の参照取得.
627 virtual const TYP& At(INDEX index) const
628 {
629 if ( ! IsInRange(index) ){ throw CIndexOutOfBoundsException(); }
630 return m_pCol->At(m_pIndexs[index]);
631 }
632 // 要素の参照取得.
633 virtual TYP& Ref(INDEX index) { throw CNotSupportException(); }
634 // 要素の設定.
635 virtual bool Set(INDEX index, const TYP& t) { return false; }
636 // 要素一つ追加.
637 virtual INDEX Add(const TYP& t) { return INVALID_INDEX; }
638 // 要素一つ削除.
639 virtual bool Remove(INDEX index)
640 {
641 if ( ! IsInRange(index) ){ return false; }
642 for ( INDEX i = index; i < m_size - 1; i++ )
643 {
644 m_pIndexs[i] = m_pIndexs[i + 1];
645 }
646 m_size--;
647 return true;
648 }
649 // 要素の入れ替え
650 virtual void Swap(INDEX index1, INDEX index2)
651 {
652 if ( ! IsInRange(index1) || ! IsInRange(index2) ){ throw CIndexOutOfBoundsException(); }
653 TNB::Swap(m_pIndexs[index1], m_pIndexs[index2]);
654 }
655 };
656
657 #endif //Document作成用シンボル
658
659 TParam m_param;
660
661public:
662
668 {
669 m_param.m_pCol = c;
670 m_param.m_size = c->GetSize();
671 m_param.m_pIndexs = new INDEX[m_param.m_size];
672 loop ( i, m_param.m_size )
673 {
674 m_param.m_pIndexs[i] = i;
675 }
676 }
677
679 virtual ~CIndexAdapterT(void)
680 {
681 if ( m_param.m_pIndexs != NULL )
682 {
683 delete[] m_param.m_pIndexs;
684 m_param.m_pIndexs = NULL;
685 }
686 }
687
699 INDEX GetRawIndex(INDEX index) const
700 {
701 return IsInRange(index) ? m_param.m_pIndexs[index] : INVALID_INDEX;
702 }
703
712 virtual bool Lock(DWORD dwTime = INFINITE) const
713 {
714 return m_param.Lock();
715 }
716
718 virtual void Unlock(void) const
719 {
720 m_param.Unlock();
721 }
722
727 virtual size_t GetSize(void) const
728 {
729 return m_param.m_size;
730 }
731
740 virtual const TYP& At(INDEX index) const
741 {
742 return m_param.At(index);
743 }
744
751 bool Remove(INDEX index)
752 {
753 return m_param.Remove(index);
754 }
755
762 void Swap(INDEX index1, INDEX index2)
763 {
764 m_param.Swap(index1, index2);
765 }
766
778 bool Sort(const IComparatorT<TYP>& comparator, bool boIsReverse = false, bool boIsBubble = false)
779 {
780 return m_param.Sort(comparator, boIsReverse, boIsBubble);
781 }
782
793 bool Sort(bool boIsReverse = false, bool boIsBubble = false)
794 {
795 return m_param.Sort(boIsReverse, boIsBubble);
796 }
797
806 size_t Cull(const IChecker& checker, bool boIsReverse = false)
807 {
808 EXCLUSIVE(this);
809 size_t r = 0;
810 if ( m_param.m_size > 0 )C
811 {
812 size_t size = m_param.m_size;
813 INDEX* P = new INDEX[size];
814 MemCopy(P, m_param.m_pIndexs, size);
815 for ( size_t i = 0; i < size; i++ )
816 {
817 if ( checker.IsValid(At(i)) ^ boIsReverse )
818 {
819 m_param.m_pIndexs[r++] = P[i];
820 }
821 }
822 m_param.m_size = r;
823 delete[] P;
824 }
825 return r;
826 }
827
832 void ResetIndex(void)
833 {
834 if ( m_param.m_size != m_pCol->GetSize() )
835 {
836 m_param.m_size = m_pCol->GetSize();
837 if ( m_param.m_pIndexs != NULL )
838 {
839 delete[] m_param.m_pIndexs;
840 }
841 m_param.m_pIndexs = new INDEX[m_param.m_size];
842 }
843 loop ( i, m_param.m_size )
844 {
845 m_param.m_pIndexs[i] = i;
846 }
847 }
848
849
850
851
852};
853
854
855
856}; // TNB
857
情報群管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
アダプタベーステンプレート
const IConstCollectionT< TYP > * m_pCol
対象のコレクション
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CAbstractAdapterT & operator=(const CAbstractAdapterT &other)
[代入] コピーオペレータ.
CAbstractAdapterT(const IConstCollectionT< TYP > *c)
コンストラクタ
virtual void Unlock(void) const
[排他] アンロック
情報参照アダプタテンプレート
virtual size_t GetSize(void) const
[取得] 要素数取得
const_iterator end(void) const
[反復] 最後const_iterator.
CConstAdapterT & operator=(const CConstAdapterT &other)
[代入] コピーオペレータ.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CConstAdapterT(size_t size, LPCVOID P)
コンストラクタ
const TYP & operator[](INDEX index) const
[取得] データ要素取得
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得.
const_iterator begin(void) const
[反復] 先頭const_iterator.
virtual void Unlock(void) const
[排他] アンロック
アペンド参照アダプタテンプレート
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CConstAppendAdapterT(const IConstCollectionT< TYP > *c1, const IConstCollectionT< TYP > *c2)
コンストラクタ
virtual void Unlock(void) const
[排他] アンロック
オフセット参照アダプタテンプレート
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
CConstOffsetAdapterT(const IConstCollectionT< TYP > *c, INDEX startIndex, size_t size=INVALID_SIZE)
コンストラクタ
リバース参照アダプタテンプレート
CConstReverseAdapterT(const IConstCollectionT< TYP > *c)
コンストラクタ
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
INDEXアダプタテンプレート
size_t Cull(const IChecker &checker, bool boIsReverse=false)
[削除] 間引き.
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual ~CIndexAdapterT(void)
デストラクタ
bool Remove(INDEX index)
[削除] 要素一つ削除.
INDEX GetRawIndex(INDEX index) const
[取得] オリジナルIndex取得.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
bool Sort(const IComparatorT< TYP > &comparator, bool boIsReverse=false, bool boIsBubble=false)
[操作] ソート.
CIndexAdapterT(const IConstCollectionT< TYP > *c)
コンストラクタ
void ResetIndex(void)
[操作] リセットインデックス.
bool Sort(bool boIsReverse=false, bool boIsBubble=false)
[操作] ソート.
virtual void Unlock(void) const
[排他] アンロック
void Swap(INDEX index1, INDEX index2)
[設定] 要素の入れ替え
INDEX範囲外例外
Definition: TnbException.h:81
サポート外例外
Definition: TnbException.h:185
オフセットアダプタテンプレート
virtual void Swap(INDEX index1, INDEX index2)
[設定] 要素の入れ替え
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual bool Remove(INDEX index)
[削除] 要素一つ削除.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
COffsetAdapterT(ICollectionT< TYP > *c, INDEX startIndex, size_t size=0)
コンストラクタ
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
virtual void Unlock(void) const
[排他] アンロック
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
インプットイテレータ.
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
void Swap(T &t1, T &t2)
[変換] スワッパー.
Definition: TnbDef.h:963
bool IsInRange(INDEX value, size_t size)
[確認] 範囲チェック.
Definition: TnbDef.h:421
TNB Library
Definition: TnbDoxyTitle.txt:2
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー
Definition: TnbDef.h:376
情報群管理操作インターフェーステンプレート
virtual void Swap(INDEX index1, INDEX index2)
[設定] 要素の入れ替え.
virtual bool Set(INDEX index, const TYP &t)=0
[設定] 要素の設定.
virtual TYP & Ref(INDEX index)=0
[取得] 要素の参照取得.
コンパレータインターフェース.
Definition: TnbComparator.h:46
情報群管理インターフェースのチェッカーインターフェース.
virtual bool IsValid(const TYP &T) const =0
[確認] チェック
情報群管理インターフェーステンプレート
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.
連続メモリ配置型情報群管理インターフェーステンプレート
virtual bool Lock(DWORD dwTime=INFINITE) const =0
[排他] ロック
virtual void Unlock(void) const =0
[排他] アンロック