TNB Library
TnbSimpleQueue.h
[詳解]
1#pragma once
15#include "TnbDef.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
43template<typename TYP, bool ISI = false, class INV = TYP>
45{
46public:
47
54 explicit CSimpleQueueT(size_t size = 10000) : m_bufferSize(size), m_pBuffer(new TYP[size]), m_dataSize(0), m_readIndex(0)
55 {
56 ASSERT( size != 0 );
57 }
58
62 virtual ~CSimpleQueueT(void)
63 {
64 delete[] m_pBuffer;
65 }
66
73 void SetQueueSize(size_t size)
74 {
75 ASSERT( size != 0 );
76 delete[] m_pBuffer;
77 m_bufferSize = size;
78 m_pBuffer = new TYP[size];
79 m_dataSize = 0;
80 m_readIndex = 0;
81 }
82
87 size_t GetQueueSize(void) const
88 {
89 return m_bufferSize;
90 }
91
96 size_t GetSize(void) const
97 {
98 return m_dataSize;
99 }
100
106 bool IsFull(void) const
107 {
108 if ( GetQueueSize() <= GetSize() )
109 {
110 return true;
111 }
112 return false;
113 }
114
124 INDEX Add(const TYP& t)
125 {
126 size_t r = GetSize();
127 return (AddElements(1, &t) == 1) ? r : INVALID_INDEX;
128 }
129
135 bool RemoveAll(void)
136 {
137 SetQueueSize(m_bufferSize);
138 return true;
139 }
140
150 size_t AddElements(size_t size, const TYP* P = NULL)
151 {
152 if ( (m_dataSize) + size > (m_bufferSize) )
153 {
154 //それ以上になるならエラー
155 return INVALID_SIZE;
156 }
157 size_t bs = m_bufferSize;
158 INDEX tmp = (m_readIndex + m_dataSize) % bs;
159 if ( P != NULL )
160 {
161 loop ( i, size )
162 {
163 m_pBuffer[tmp++] = *P++;
164 if ( tmp >= bs )
165 {
166 tmp -= bs;
167 }
168 }
169 }
170 else
171 {
172 loop ( i, size )
173 {
174 m_pBuffer[tmp++] = TYP();
175 if ( tmp >= bs )
176 {
177 tmp -= bs;
178 }
179 }
180 }
181 m_dataSize += size;
182 return size;
183 }
184
191 TYP Take(void)
192 {
193 TYP t;
194 if ( TakeElements(1, &t) == 1 )
195 {
196 return t;
197 }
198 ASSERT0( false, "CSimpleQueueT::Take()", "キューが空の時取得操作されました。" );
199 throw CEmptyException();
200 }
201
211 size_t TakeElements(size_t size, TYP* P = NULL)
212 {
213 if ( m_dataSize < size )
214 {
215 //キューにその長さの情報がないのでエラー
216 return INVALID_SIZE;
217 }
218 size_t bs = m_bufferSize;
219 if ( P != NULL || ISI )
220 {
221 INDEX tmp = m_readIndex;
222 loop ( i, size )
223 {
224 if ( P != NULL )
225 {
226 *P++ = m_pBuffer[tmp];
227 }
228 if ( ISI )
229 {
230 m_pBuffer[tmp] = INV();
231 }
232 if ( ++tmp >= bs )
233 {
234 tmp -= bs;
235 }
236 }
237 }
238 m_readIndex += size;
239 m_readIndex %= bs;
240 m_dataSize -= size;
241 return size;
242 }
243
250 const TYP& Ref(INDEX index) const
251 {
252 if ( GetSize() > index )
253 {
254 INDEX tmp = m_readIndex + index;
255 tmp %= m_bufferSize;
256 return m_pBuffer[tmp];
257 }
259 }
260
267 TYP& Ref(INDEX index)
268 {
269 if ( GetSize() > index )
270 {
271 INDEX tmp = m_readIndex + index;
272 tmp %= m_bufferSize;
273 return m_pBuffer[tmp];
274 }
276 }
277
283 size_t GetFreeSize(void) const
284 {
285 return (m_bufferSize) - (m_dataSize);
286 }
287
288private:
289
290 size_t m_bufferSize;
291 size_t m_dataSize;
292 INDEX m_readIndex;
293 TYP* m_pBuffer;
294};
295
296
297
298}; // TNB
TNBライブラリの定義ヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
取得要素(空き)無し例外
Definition: TnbException.h:107
INDEX範囲外例外
Definition: TnbException.h:81
簡易リング式キュー型情報管理テンプレート
void SetQueueSize(size_t size)
[設定] リングキューサイズ指定.
TYP Take(void)
[取得] 先頭要素取り出し.
size_t GetSize(void) const
[取得] 要素数取得
bool RemoveAll(void)
[削除] データ全削除.
virtual ~CSimpleQueueT(void)
デストラクタ
size_t TakeElements(size_t size, TYP *P=NULL)
[取得] 複数要素取り出し.
size_t AddElements(size_t size, const TYP *P=NULL)
[追加] 複数要素追加.
TYP & Ref(INDEX index)
[取得] 要素アドレス取得
bool IsFull(void) const
[確認] 満タン?
const TYP & Ref(INDEX index) const
[取得] 要素参照
size_t GetFreeSize(void) const
[取得] 格納可能数取得.
INDEX Add(const TYP &t)
[追加] 要素追加.
size_t GetQueueSize(void) const
[取得] リングキューサイズ取得.
CSimpleQueueT(size_t size=10000)
コンストラクタ
TNB Library
Definition: TnbDoxyTitle.txt:2