TNB Library
TnbVector.h
[詳解]
1#pragma once
16#include "TnbException.h"
17#include "TnbCollection.h"
18#include "TnbPointerHandle.h"
19
20
21
22//TNB Library
23namespace TNB
24{
25
26
27
73template<typename TYP>
74class CVectorT : public ICollectionT<TYP> , public ISequenceCollectionT<TYP>
75{
76 DEFSUPER(ICollectionT<TYP>);
77public:
78
79 #ifndef _TnbDOXYGEN //Document作成用シンボル
80 // const_iterator型宣言
81 typedef const TYP* const_iterator;
82 // iterator型宣言
83 typedef TYP* iterator;
84 #endif //_TnbDOXYEM
85
91 const_iterator begin(void) const { return m_hptHead->data(0); }
92
98 const_iterator end(void) const { return m_hptHead->data(GetSize()); }
99
105 iterator begin(void) { m_Separate(); return m_hptHead->data(0); }
106
112 iterator end(void) { m_Separate(); return m_hptHead->data(GetSize()); }
113
120 iterator insert(iterator ite, const TYP& t = TYP())
121 {
122 INT_PTR index = ite - begin();
123 Insert(index, t);
124 return begin() + index;
125 }
126
133 {
134 INT_PTR index = ite - begin();
135 if ( ! Remove(index) ) { return end(); }
136 return begin() + index;
137 }
138
143 void push_front(const TYP& t) { Insert(0, t); }
144
149 void push_back(const TYP& t) { Add(t); }
150
151
152 //------------------------
153
154
161 explicit CVectorT(size_t size = 0) : _super()
162 {
163 m_Init();
164 SetIncrementSize(size);
165 }
166
172 CVectorT(const CVectorT<TYP>& other) : _super()
173 {
174 m_Init();
175 if ( other.m_hptHead.GetReferCount() < 0)
176 {
177 SetElements(other.GetSize(), other.ReferBuffer());
178 }
179 else
180 {
181 m_hptHead = other.m_hptHead;
182 }
183 }
184
186 virtual ~CVectorT(void)
187 {
188 m_hptHead.Null();
189 }
190
199 {
200 EXCLUSIVE(&other);
201 if ( other.m_hptHead.GetReferCount() < 0)
202 {
203 SetElements(other.GetSize(), other.ReferBuffer());
204 }
205 else
206 {
207 m_hptHead = other.m_hptHead;
208 }
209 return *this;
210 }
211
220 virtual TYP Get(INDEX index) const
221 {
222 return * m_hptHead->datack(index);
223 }
224
233 virtual const TYP& At(INDEX index) const
234 {
235 return * m_hptHead->datack(index);
236 }
237
246 virtual TYP& Ref(INDEX index)
247 {
248 TYP* P = m_GetPtr(index);
249 if ( P == NULL )
250 {
252 }
253 return *P;
254 }
255
265 virtual bool Set(INDEX index, const TYP& t)
266 {
267 TYP* P = m_GetPtr(index);
268 if ( P == NULL )
269 {
270 return false;
271 }
272 *P = t;
273 return true;
274 }
275
284 const TYP& operator[](INDEX index) const
285 {
286 return At(index);
287 }
288
297 TYP& operator[](INDEX index)
298 {
299 TYP* P = m_GetPtr(index);
300 if ( P != NULL ){ return *P; }
302 }
303
312 {
313 AddElements(vector.GetSize(), vector.ReferBuffer());
314 return *this;
315 }
316
326 {
327 CVectorT v = *this;
328 v += other;
329 return v;
330 }
331
340 void SetIncrementSize(size_t size)
341 {
342 m_incrementSize = size;
343 }
344
353 virtual bool Lock(DWORD dwTime = INFINITE) const
354 {
355 return m_syncFunc.Lock();
356 }
357
359 virtual void Unlock(void) const
360 {
361 m_syncFunc.Unlock();
362 }
363
368 virtual size_t GetSize(void) const
369 {
370 ASSERTLIB(! m_hptHead.IsNull());
371 return m_hptHead->dataSize;
372 }
373
383 virtual INDEX Add(const TYP& t)
384 {
385 size_t r = GetSize();
386 return (AddElements(1, &t) == 1) ? r : INVALID_INDEX;
387 }
388
397 virtual bool Remove(INDEX index)
398 {
399 return RemoveElements(index, 1) == 1;
400 }
401
409 virtual size_t RemoveElements(INDEX index, size_t size = 0)
410 {
411 EXCLUSIVE(this);
412 if ( IsInRange(index) )
413 {
414 m_Separate();
415 size_t nowSize = GetSize();
416 TYP* P = m_hptHead->pBuffer;
417 //削除サイズ調整
418 if ( size == 0 || nowSize - index <= size )
419 {
420 if ( index == 0 )
421 {
422 return RemoveAll() ? nowSize : INVALID_SIZE;
423 }
424 size = nowSize - index;
425 }
426 //削除範囲の後の移動が必要な数
427 if ( nowSize > index + size )
428 {
429 loop ( i, nowSize - (index + size) )
430 {
431 ASSERTLIB( index + i + size < nowSize );
432 P[index + i] = P[index + i + size];
433 }
434 }
435 //いらない部分を消す
436 size_t s = m_hptHead->dataSize - size;
437 loop ( i, size )
438 {
439 P[i + s] = TYP();
440 }
441 //
442 m_hptHead->dataSize -= size;
443 return size;
444 }
445 return INVALID_SIZE;
446 }
447
456 virtual size_t AddElements(size_t size, const TYP* P = NULL)
457 {
458 if ( size == 0 )
459 {
460 }
461 else if ( m_hptHead.IsNull() )
462 {
463 ASSERTLIB(false);
464 //=== 自分は情報を持っていない
465 THead* lpTmp = m_CreateHead(size);
466 m_CopyBuffer(lpTmp->pBuffer, P, size);
467 m_hptHead = lpTmp;
468 }
469 else
470 {
471 EXCLUSIVE(this);
472 m_hptHead->syncObj.Lock();
473 THead* ptHead = m_hptHead;
474 if ( m_hptHead.GetReferCount() > 1 )
475 {
476 size_t l = ptHead->dataSize + size;
477 THead* lpTmp = m_CreateHead(l);
478 m_CopyBuffer(lpTmp->pBuffer, ptHead->pBuffer, ptHead->dataSize);
479 m_CopyBuffer(lpTmp->data(ptHead->dataSize), P, size);
480 m_hptHead->syncObj.Unlock();
481 m_hptHead = lpTmp;
482 }
483 else
484 {
485 m_hptHead->syncObj.Unlock();
486 size_t l = ptHead->dataSize + size;
487 //二つを足したバッファサイズを確保してある?
488 if ( ptHead->bufferSize >= l )
489 {
490 //== 足りる
491 m_CopyBuffer(ptHead->data(ptHead->dataSize), P, size);
492 ptHead->dataSize = l;
493 }
494 else
495 {
496 //== 足りない
497 //新たにメモリ確保
498 size_t ss = m_GetSecureSize(l);
499 TYP* N = new TYP[ss];
500 //データを代入
501 m_CopyBuffer(&N[0], ptHead->pBuffer, ptHead->dataSize);
502 m_CopyBuffer(&N[ptHead->dataSize], P, size);
503 //現在のバッファを開放
504 if ( ptHead->pBuffer != NULL )
505 {
506 delete[] ptHead->pBuffer;
507 }
508 //新しくバッファアドレスを指定
509 ptHead->bufferSize = ss;
510 ptHead->dataSize = l;
511 ptHead->pBuffer = N;
512 }
513 }
514 }
515 return size;
516 }
517
526 virtual size_t SetElements(size_t size, const TYP* P = NULL)
527 {
528 CVectorT v;
529 size_t r = v.AddElements(size, P);
530 if ( r >= 0 )
531 {
532 m_hptHead = v.m_hptHead;
533 }
534 return r;
535 }
536
545 virtual size_t Append(const IConstCollectionT<TYP>& c)
546 {
547 EXCLUSIVE2(&c, this);
548 size_t as = c.GetSize();
549 size_t j = GetSize();
550 SetSize(j + as);
551 TYP* P = m_hptHead->data(j);
552 loop ( i, as )
553 {
554 *P++ = c.At(i);
555 }
556 return as;
557 }
558
565 virtual bool RemoveAll(void)
566 {
567 m_Init();
568 return true;
569 }
570
579 virtual bool Insert(INDEX index, const TYP& t)
580 {
581 EXCLUSIVE(this);
582 if ( ! TNB::IsInRange(index, GetSize() + 1) )
583 {
584 return false;
585 }
586 if ( Add(TYP()) == INVALID_INDEX )
587 {
588 return false;
589 }
590 size_t size = GetSize() - 1;
591 TYP* P = m_hptHead->pBuffer;
592 for ( size_t i = size; i > index; i-- )
593 {
594 P[i] = P[i - 1];
595 }
596 P[index] = t;
597 return true;
598 }
599
604 void Invalid(void)
605 {
606 RemoveAll();
607 m_hptHead->boValid = false;
608 }
609
618 virtual bool SetSize(size_t size)
619 {
620 if ( size != INVALID_SIZE )
621 {
622 EXCLUSIVE(this);
623 if ( IsEmpty() )
624 {
625 //バッファなし
626 SetElements(size);
627 }
628 else if ( size == 0 )
629 {
630 m_Init();
631 }
632 else
633 {
634 size_t now = m_hptHead->dataSize;
635 if ( now > size )
636 {
637 //今より小さく
638 m_Separate();
639 TYP* P = m_hptHead->data(size);
640 for ( size_t i = size; i < now; i++ )
641 {
642 *P++ = TYP();
643 }
644 m_hptHead->dataSize = size;
645 }
646 else if ( now < size )
647 {
648 //今より大きく
649 AddElements(size - now);
650 }
651 }
652 }
653 return true;
654 }
655
664 virtual const TYP* ReferBuffer(void) const
665 {
666 ASSERTLIB(! m_hptHead.IsNull());
667 return m_hptHead->pBuffer;
668 }
669
676 {
677 return m_hptHead.GetReferCount();
678 }
679
687 bool IsValid(void) const
688 {
689 if ( IsEmpty() && ! m_hptHead->boValid )
690 {
691 return false;
692 }
693 return true;
694 }
695
705 CVectorT<TYP> Mid(INDEX startIndex, size_t size = 0) const
706 {
707 CVectorT v;
708 EXCLUSIVE(this);
709 if ( ! IsEmpty() )
710 {
711 if ( m_hptHead->dataSize > startIndex )
712 {
713 if ( size == 0 || m_hptHead->dataSize - startIndex < size )
714 {
715 //取得データ長まで取り出せない 最後まで取得にする
716 size = m_hptHead->dataSize - startIndex;
717 }
718 v.SetElements(size, m_hptHead->data(startIndex));
719 }
720 }
721 return v;
722 }
723
745 TYP* GetBuffer(size_t size = 0)
746 {
747 if ( IsEmpty() && size == 0 )
748 {
749 return NULL;
750 }
751 m_hptHead->syncObj.Lock();
752 Lock();
753 //---自クラスにバッファがある
754 int iCnt = m_hptHead.GetReferCount();
755 if ( iCnt < 0 )
756 {
757 //---もう固定バッファになってる
758 m_hptHead->syncObj.Unlock();
759 if ( size > 0 )
760 {
761 SetSize(size);
762 }
763 }
764 else if ( iCnt == 1 )
765 {
766 //---このクラスでしか使ってない
767 m_hptHead->syncObj.Unlock();
768 if ( size > 0 )
769 {
770 SetSize(size);
771 }
772 //参照数を-1にする。
773 m_hptHead.SetReferCount(-1);
774 }
775 else
776 {
777 //---他でも使われてる
778 //新たに確保せねば
779 if ( size == 0 )
780 {
781 size = m_hptHead->dataSize;
782 }
783 //新たにメモリ確保
784 THead* lpTmp = m_CreateHead(size);
785 //データを代入
786 m_CopyBuffer(lpTmp->pBuffer, m_hptHead->pBuffer, size);
787 //新しくバッファアドレスを指定
788 m_hptHead->syncObj.Unlock();
789 m_hptHead = lpTmp;
790 //参照数を-1にする。
791 m_hptHead.SetReferCount(-1);
792 }
793 Unlock();
794 return m_hptHead->pBuffer;
795 }
796
805 void ReleaseBuffer(void)
806 {
807 if ( ! IsEmpty() )
808 {
809 m_hptHead->syncObj.Lock();
810 //---自クラスにバッファがある
811 if ( m_hptHead.GetReferCount() < 0 )
812 {
813 //---固定バッファになってる
814 //参照1の普通のバッファになる
815 m_hptHead.SetReferCount(1);
816 }
817 m_hptHead->syncObj.Unlock();
818 }
819 }
820
829 inline friend CVectorT<TYP> ToVector(const IConstCollectionT<TYP>& c, size_t size = 0)
830 {
831 EXCLUSIVE(&c);
832 size_t l = c.GetSize();
833 if ( size == 0 || size > l )
834 {
835 size = l;
836 }
837 CVectorT vb;
838 vb.SetSize(size);
839 TYP* P = vb.m_hptHead->data();
840 loop ( i, size )
841 {
842 *P++ = c.At(i);
843 }
844 return vb;
845 }
846
847private:
848
849 #ifndef _TnbDOXYGEN //Document作成用シンボル
851 struct THead
852 {
853 CSyncSection syncObj;
854 size_t bufferSize;
855 size_t dataSize;
856 bool boValid;
857 TYP * pBuffer;
858
860 THead(void) : bufferSize(0) , dataSize(0) , boValid(true) , pBuffer(NULL) {}
861
863 virtual ~THead(void)
864 {
865 if ( pBuffer != NULL )
866 {
867 delete[] pBuffer;
868 pBuffer = NULL;
869 }
870 }
871
877 TYP* data(INDEX f = 0) const
878 {
879 return pBuffer + f;
880 }
881
887 TYP* datack(INDEX f = 0) const
888 {
889 if ( TNB::IsInRange(f, dataSize) )
890 {
891 return pBuffer + f;
892 }
894 }
895 };
896 #endif
897
898 CPointerHandleT<THead> m_hptHead;
899 CSyncSection m_syncFunc;
900 size_t m_incrementSize;
901
907 size_t m_GetSecureSize(size_t size)
908 {
909 //追加サイズ計算
910 size_t marginSize = m_incrementSize;
911 if ( marginSize == 0 )
912 {
913 //自動になっている
914 marginSize = size / 8;
915 marginSize = (marginSize < 4) ? 4 : ((marginSize > 1024) ? 1024 : marginSize);
916 }
917 return size + marginSize;
918 }
919
927 THead* m_CreateHead(size_t size)
928 {
929 THead* lptTmpHead = new THead;
930 //長さを入れる
931 size_t bs = m_GetSecureSize(size);
932 lptTmpHead->dataSize = size;
933 lptTmpHead->bufferSize = bs;
934 //バッファを確保する
935 lptTmpHead->pBuffer = new TYP[bs];
936 return lptTmpHead;
937 }
938
946 void m_CopyBuffer(TYP* _lpDst, const TYP* lpSrc, size_t iLen)
947 {
948 ASSERTLIB(_lpDst != NULL);
949 if ( lpSrc == NULL )
950 {
951 TYP t = TYP();
952 while ( iLen-- )
953 {
954 *_lpDst++ = t;
955 }
956 }
957 else
958 {
959 ASSERTLIB(! ::IsBadReadPtr(lpSrc, iLen));
960 while ( iLen-- )
961 {
962 *_lpDst++ = *lpSrc++;
963 }
964 }
965 }
966
971 void m_Init(void)
972 {
973 m_hptHead = new THead;
974 m_incrementSize = 0;
975 }
976
978 void m_Separate(void)
979 {
980 m_hptHead->syncObj.Lock();
981 if ( m_hptHead.GetReferCount() > 1 )
982 {
983 size_t size = m_hptHead->dataSize;
984 //新たにメモリ確保
985 THead* lpTmp = m_CreateHead(size);
986 //データを代入
987 m_CopyBuffer(lpTmp->pBuffer, m_hptHead->pBuffer, size);
988 //新しくバッファアドレスを指定
989 m_hptHead->syncObj.Unlock();
990 m_hptHead = lpTmp;
991 }
992 else
993 {
994 m_hptHead->syncObj.Unlock();
995 }
996 }
997
1004 TYP* m_GetPtr(INDEX index)
1005 {
1006 if ( TNB::IsInRange(index, m_hptHead->dataSize) )
1007 {
1008 m_Separate();
1009 return m_hptHead->data(index);
1010 }
1011 return NULL;
1012 }
1013
1014 friend class CVectorTest;
1015};
1016
1017
1018
1038template<typename TYP>
1039class CAutoVectorT : public CVectorT<TYP>
1040{
1041 DEFSUPER(CVectorT<TYP>);
1042public:
1043
1053 virtual bool Set(INDEX index, const TYP& t)
1054 {
1055 if ( GetSize() <= index )
1056 {
1057 SetSize(index + 1);
1058 }
1059 return _super::Set(index, t);
1060 }
1061
1070 virtual bool Insert(INDEX index, const TYP& t)
1071 {
1072 if ( GetSize() < index )
1073 {
1074 SetSize(index);
1075 }
1076 return _super::Insert(index, t);
1077 }
1078
1087 const TYP& operator[](INDEX index) const
1088 {
1089 if ( ! IsInRange(index) )
1090 {
1092 }
1093 return _super::operator[](index);
1094 }
1095
1104 TYP& operator[](INDEX index)
1105 {
1106 if ( GetSize() <= index )
1107 {
1108 SetSize(index + 1);
1109 }
1110 return _super::operator[](index);
1111 }
1112};
1113
1114
1115
1123
1124
1125
1133
1134
1135
1143
1144
1145
1146#ifdef __AFX_H__
1147
1156 inline CByteVector ToByteVector(const CByteArray &ba)
1157 {
1158 CByteVector v;
1159 v.SetElements(static_cast<size_t>(ba.GetSize()), ba.GetData());
1160 return v;
1161 }
1162
1171 inline void Copy(CByteArray &ba, const CByteVector &dat)
1172 {
1173 ba.SetSize(dat.GetSize());
1174 MemCopy(ba.GetData(), dat.ReferBuffer(), dat.GetSize());
1175 }
1176
1177#endif
1178
1179
1180
1181}; // TNB
1182
情報群管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
例外状態管理関係のヘッダ
ポインタハンドル関係のヘッダ
自動拡張列型情報管理テンプレート
Definition: TnbVector.h:1040
virtual bool Insert(INDEX index, const TYP &t)
[追加] 要素一つ挿入
Definition: TnbVector.h:1070
const TYP & operator[](INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:1087
TYP & operator[](INDEX index)
[取得] 要素の参照取得.
Definition: TnbVector.h:1104
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
Definition: TnbVector.h:1053
INDEX範囲外例外
Definition: TnbException.h:81
int SetReferCount(int iCount)
[設定] 参照数設定
int GetReferCount(void) const
[取得] 参照数取得.
bool IsNull(void) const
[確認] NULLチェック
void Null(void)
[設定] 開放.
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
配列型情報管理テンプレート
Definition: TnbVector.h:75
iterator insert(iterator ite, const TYP &t=TYP())
[反復] 挿入
Definition: TnbVector.h:120
friend CVectorT< TYP > ToVector(const IConstCollectionT< TYP > &c, size_t size=0)
[作成] Vector作成
Definition: TnbVector.h:829
CVectorT & operator+=(const CVectorT< TYP > &vector)
[追加] 追加オペレータ
Definition: TnbVector.h:311
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
const_iterator end(void) const
[反復] 最後const_iterator.
Definition: TnbVector.h:98
friend class CVectorTest
フレンドクラス宣言
Definition: TnbVector.h:1014
virtual bool Insert(INDEX index, const TYP &t)
[追加] 要素一つ挿入
Definition: TnbVector.h:579
virtual size_t RemoveElements(INDEX index, size_t size=0)
[削除] 要素削除.
Definition: TnbVector.h:409
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
Definition: TnbVector.h:220
TYP * GetBuffer(size_t size=0)
[操作] データアドレス取得
Definition: TnbVector.h:745
void push_front(const TYP &t)
[反復] 先頭に挿入
Definition: TnbVector.h:143
iterator begin(void)
[反復] 先頭iterator.
Definition: TnbVector.h:105
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbVector.h:340
CVectorT< TYP > operator+(const CVectorT< TYP > &other) const
[作成] 連結
Definition: TnbVector.h:325
void ReleaseBuffer(void)
[操作] データの管理を元に戻す.
Definition: TnbVector.h:805
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
void Invalid(void)
[操作] 無効状態にする
Definition: TnbVector.h:604
iterator erase(iterator ite)
[反復] 削除
Definition: TnbVector.h:132
bool IsValid(void) const
[確認] 有効チェック
Definition: TnbVector.h:687
virtual bool SetSize(size_t size)
[操作] サイズ指定
Definition: TnbVector.h:618
CVectorT(size_t size=0)
コンストラクタ
Definition: TnbVector.h:161
const TYP & operator[](INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:284
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
Definition: TnbVector.h:246
virtual ~CVectorT(void)
デストラクタ
Definition: TnbVector.h:186
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual size_t AddElements(size_t size, const TYP *P=NULL)
[追加] 複数要素追加.
Definition: TnbVector.h:456
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
Definition: TnbVector.h:705
CVectorT & operator=(const CVectorT &other)
[代入] 代入
Definition: TnbVector.h:198
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
void push_back(const TYP &t)
[反復] 最後に追加
Definition: TnbVector.h:149
CVectorT(const CVectorT< TYP > &other)
コピーコンストラクタ
Definition: TnbVector.h:172
const_iterator begin(void) const
[反復] 先頭const_iterator.
Definition: TnbVector.h:91
TYP & operator[](INDEX index)
[取得] 要素の参照取得.
Definition: TnbVector.h:297
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbVector.h:359
virtual size_t Append(const IConstCollectionT< TYP > &c)
[追加] 追加.
Definition: TnbVector.h:545
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
Definition: TnbVector.h:265
virtual size_t SetElements(size_t size, const TYP *P=NULL)
[設定] 複数要素設定.
Definition: TnbVector.h:526
iterator end(void)
[反復] 最後iterator.
Definition: TnbVector.h:112
int GetReferCount(void)
[取得] 参照数取得
Definition: TnbVector.h:675
インプットイテレータ.
ランダムアクセスイテレータ.
void Copy(CByteArray &ba, const CByteVector &dat)
[複製] CByteVector からCByteArrayへコピー
Definition: TnbVector.h:1171
TNB::CVectorT< WORD > CWordVector
WORD配列管理クラス
Definition: TnbVector.h:1132
TNB::CVectorT< DWORD > CDwordVector
DWORD配列管理クラス
Definition: TnbVector.h:1142
TNB::CVectorT< BYTE > CByteVector
BYTE配列管理クラス
Definition: TnbVector.h:1122
CByteVector ToByteVector(const CByteArray &ba)
[複製] CByteArrayから CByteVector へコピー
Definition: TnbVector.h:1156
#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
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー
Definition: TnbDef.h:376
情報群管理操作インターフェーステンプレート
情報群管理インターフェーステンプレート
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual const TYP & At(INDEX index) const =0
[取得] 要素の参照取得.
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.
連続メモリ配置型情報群管理インターフェーステンプレート