TNB Library
TnbSimpleVector.h
[詳解]
1#pragma once
16#include "TnbException.h"
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
54template<typename TYP>
56{
57public:
59 explicit CSimpleVectorT(void) : m_bufferSize(0), m_dataSize(0), m_pBuffer(NULL)
60 {
61 }
62
65 explicit CSimpleVectorT(size_t bufferSize) : m_bufferSize(bufferSize), m_dataSize(0)
66 {
67 m_pBuffer = new TYP[m_bufferSize];
68 }
69
74 CSimpleVectorT(const CSimpleVectorT& other) : m_bufferSize(0), m_dataSize(0), m_pBuffer(NULL)
75 {
76 operator=(other);
77 }
78
80 virtual ~CSimpleVectorT(void)
81 {
82 RemoveAll();
83 }
84
91 {
92 size_t l = other.GetSize();
93 SetSize(l);
94 loop ( i, l )
95 {
96 Set(i, other.At(i));
97 }
98 return *this;
99 }
100
107 const TYP& At(INDEX index) const
108 {
109 if ( m_dataSize <= index ) { throw CIndexOutOfBoundsException(); }
110 return m_pBuffer[index];
111 }
112
119 TYP& At(INDEX index)
120 {
121 if ( m_dataSize <= index ) { throw CIndexOutOfBoundsException(); }
122 return m_pBuffer[index];
123 }
124
131 const TYP& operator[](INDEX index) const
132 {
133 if ( m_dataSize <= index ) { throw CIndexOutOfBoundsException(); }
134 return m_pBuffer[index];
135 }
136
143 TYP& operator[](INDEX index)
144 {
145 if ( m_dataSize <= index ) { throw CIndexOutOfBoundsException(); }
146 return m_pBuffer[index];
147 }
148
156 bool Set(INDEX index, const TYP& t)
157 {
158 if ( m_dataSize <= index ) { return false; }
159 m_pBuffer[index] = t;
160 return true;
161 }
162
169 bool IsInRange(INDEX index) const
170 {
171 return TNB::IsInRange(index, GetSize());
172 }
173
180 bool IsEmpty(void) const
181 {
182 return m_dataSize == 0;
183 }
184
189 size_t GetSize(void) const
190 {
191 return m_dataSize;
192 }
193
198 operator size_t(void) const
199 {
200 return m_dataSize;
201 }
202
207 TYP* ReferBuffer(void)
208 {
209 return m_pBuffer;
210 }
211
216 const TYP* ReferBuffer(void) const
217 {
218 return m_pBuffer;
219 }
220
225 void SetSize(size_t s)
226 {
227 if ( s == 0 )
228 {
229 RemoveAll();
230 }
231 else if ( s > GetSize() )
232 {
233 if ( m_bufferSize < s )
234 {
235 m_bufferSize = m_GetSecureSize(s + 1);
236 TYP* P = new TYP[m_bufferSize];
237 loop ( i, m_dataSize )
238 {
239 P[i] = m_pBuffer[i];
240 }
241 if ( m_pBuffer != NULL )
242 {
243 delete[] m_pBuffer;
244 }
245 m_pBuffer = P;
246 }
247 }
248 m_dataSize = s;
249 }
250
258 INDEX Add(const TYP& t)
259 {
260 if ( m_bufferSize <= m_dataSize )
261 {
262 m_bufferSize = m_GetSecureSize(m_bufferSize + 1);
263 TYP* P = new TYP[m_bufferSize];
264 loop ( i, m_dataSize )
265 {
266 P[i] = m_pBuffer[i];
267 }
268 if ( m_pBuffer != NULL )
269 {
270 delete[] m_pBuffer;
271 }
272 m_pBuffer = P;
273 }
274 m_pBuffer[m_dataSize] = t;
275 m_dataSize += 1;
276 return m_dataSize - 1;
277 }
278
285 bool Remove(INDEX index)
286 {
287 if ( IsInRange(index) )
288 {
289 for ( INDEX i = index ; i < m_dataSize - 1; i++ )
290 {
291 m_pBuffer[i] = m_pBuffer[i + 1];
292 }
293 m_dataSize--;
294 return true;
295 }
296 return false;
297 }
298
303 void RemoveAll(void)
304 {
305 m_bufferSize = 0;
306 m_dataSize = 0;
307 if ( m_pBuffer != NULL )
308 {
309 delete[] m_pBuffer;
310 m_pBuffer = NULL;
311 }
312 }
313
320 INDEX Find(const TYP& t) const
321 {
322 loop ( i, m_dataSize )
323 {
324 if ( m_pBuffer[i] == t )
325 {
326 return i;
327 }
328 }
329 return INVALID_INDEX;
330 }
331
332private:
333 size_t m_bufferSize;
334 size_t m_dataSize;
335 TYP * m_pBuffer;
337 size_t m_GetSecureSize(size_t size)
338 {
339 size_t marginSize = size / 8;
340 marginSize = (marginSize < 4) ? 4 : ((marginSize > 1024) ? 1024 : marginSize);
341 return size + marginSize;
342 }
343};
344
345
346
347}; // TNB
348
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
例外状態管理関係のヘッダ
INDEX範囲外例外
Definition: TnbException.h:81
簡易配列型情報管理テンプレート
TYP * ReferBuffer(void)
[取得] バッファ取得
bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
bool IsEmpty(void) const
[確認] 要素の有無確認.
void RemoveAll(void)
[削除] 空化
const TYP * ReferBuffer(void) const
[取得] バッファ取得
size_t GetSize(void) const
[取得] サイズ取得
TYP & At(INDEX index)
[取得] 要素の参照取得.
bool Remove(INDEX index)
[削除] 要素一つ削除.
virtual ~CSimpleVectorT(void)
デストラクタ
INDEX Find(const TYP &t) const
[検索] 検索.
const TYP & operator[](INDEX index) const
[取得] 要素の参照取得.
CSimpleVectorT(size_t bufferSize)
コンストラクタ
void SetSize(size_t s)
[設定] サイズ設定
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.
CSimpleVectorT(const CSimpleVectorT &other)
コピーコンストラクタ
const TYP & At(INDEX index) const
[取得] 要素の参照取得.
CSimpleVectorT(void)
コンストラクタ
TYP & operator[](INDEX index)
[取得] 要素の参照取得.
INDEX Add(const TYP &t)
[追加] 要素一つ追加.
CSimpleVectorT & operator=(const CSimpleVectorT &other)
[複製] コピーオペレータ
bool IsInRange(INDEX value, size_t size)
[確認] 範囲チェック.
Definition: TnbDef.h:421
TNB Library
Definition: TnbDoxyTitle.txt:2