TNB Library
TnbPriorityQueue.h
[詳解]
1#pragma once
13#include "TnbListQueue.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
43template<typename TYP>
44class CPriorityQueueT : public ICollectionMidT<TYP>, public IQueueT<TYP>, CCopyImpossible
45{
46 DEFSUPER(ICollectionMidT<TYP>);
47 CListT<CListQueueT<TYP> > m_listQueue;
48 int m_iLevelMax;
49
56 INDEX m_LevelToIndex(int iLevel)
57 {
58 if ( m_iLevelMax < iLevel )
59 {
60 return INVALID_INDEX;
61 }
62 iLevel += m_iLevelMax;
63 if ( iLevel < 0 )
64 {
65 return INVALID_INDEX;
66 }
67 return iLevel;
68 }
69
70protected:
71
78 virtual const TYP* m_GetConstPointer(INDEX index) const
79 {
80 if ( index >= 0 )
81 {
82 try
83 {
84 for ( INDEX i = m_listQueue.GetSize() - 1; i >= 0; i-- )
85 {
86 size_t size = m_listQueue[i].GetSize();
87 if ( size > index )
88 {
89 return &(m_listQueue[i][index]); //範囲内のはず
90 }
91 index -= size;
92 }
93 }
94 catch(CTnbException& e)
95 {
96 e.OnCatch();
97 }
98 }
99 return NULL;
100 }
101
108 virtual TYP* m_GetPointer(INDEX index)
109 {
110 if ( index >= 0 )
111 {
112 try
113 {
114 for ( INDEX i = m_listQueue.GetSize() - 1; i >= 0; i-- )
115 {
116 size_t size = m_listQueue[i].GetSize();
117 if ( size > index )
118 {
119 return &(m_listQueue[i][index]); //範囲内のはず
120 }
121 index -= size;
122 }
123 }
124 catch(CTnbException& e)
125 {
126 e.OnCatch();
127 }
128 }
129 return NULL;
130 }
131
132public:
133
139 explicit CPriorityQueueT(int iLevel = 3) : _super()
140 {
141 if ( iLevel < 0 )
142 {
143 iLevel = -iLevel;
144 }
145 m_iLevelMax = iLevel;
147 loop ( i, iLevel * 2 + 1 )
148 {
149 m_listQueue.Add(q);
150 }
151 }
152
161 virtual bool Lock(DWORD dwTime = INFINITE) const
162 {
163 return m_listQueue.Lock();
164 }
165
167 virtual void Unlock(void) const
168 {
169 m_listQueue.Unlock();
170 }
171
176 virtual size_t GetSize(void) const
177 {
178 EXCLUSIVE(this);
179 size_t size = 0;
180 for ( INDEX i = m_listQueue.GetSize() - 1; i >= 0; i-- )
181 {
182 size += m_listQueue[i].GetSize();
183 }
184 return size;
185 }
186
187
196 virtual INDEX Add(const TYP& t)
197 {
198 return Add(0, t);
199 }
200
209 virtual size_t AddElements(size_t size, const TYP* P = NULL)
210 {
211 return AddElements(0, size, P);
212 }
213
219 virtual bool RemoveAll(void)
220 {
221 return m_listQueue.RemoveAll();
222 }
223
230 size_t GetSize(int iLevel) const
231 {
232 EXCLUSIVE(this);
233 INDEX index = m_LevelToIndex(iLevel);
234 if ( index != INVALID_INDEX )
235 {
236 return m_listQueue[index].GetSize();
237 }
238 return INVALID_SIZE;
239 }
240
250 size_t AddElements(int iLevel, size_t size, const TYP* P = NULL)
251 {
252 EXCLUSIVE(this);
253 if ( P != NULL )
254 {
255 loop ( i, size )
256 {
257 Add(iLevel, *P++);
258 }
259 }
260 else
261 {
262 loop ( i, size )
263 {
264 Add(iLevel, TYP());
265 }
266 }
267 return size;
268 }
269
280 INDEX Add(int iLevel, const TYP& t)
281 {
282 INDEX index = m_LevelToIndex(iLevel);
283 if ( index == INVALID_INDEX )
284 {
285 return INVALID_INDEX;
286 }
287 return m_listQueue[index].Add(t);
288 }
289
298 INDEX AddEx(int iLevel, const TYP& t)
299 {
300 EXCLUSIVE(this);
301 return Add(iLevel, t);
302 }
303
313 size_t Append(int iLevel, const IConstCollectionT<TYP> &c)
314 {
315 EXCLUSIVE(this);
316 INDEX index = m_LevelToIndex(iLevel);
317 if ( index == INVALID_SIZE )
318 {
319 return INVALID_SIZE;
320 }
321 return m_listQueue[index].Append(c);
322 }
323
330 virtual TYP Take(void)
331 {
332 EXCLUSIVE(this);
333 for ( INDEX i = m_listQueue.GetSize() - 1; i >= 0; i-- )
334 {
335 if ( ! m_listQueue[i].IsEmpty() )
336 {
337 TYP t = m_listQueue[i].Get(0);
338 m_listQueue[i].Remove(0);
339 return t;
340 }
341 }
342 ASSERT0(false, "CPriorityQueueT::Take()", "キューが空の時取得操作されました。");
343 throw CEmptyException();
344 }
345
353 TYP Take(int iLevel)
354 {
355 EXCLUSIVE(this);
356 INDEX index = m_LevelToIndex(iLevel);
357 if ( index != INVALID_INDEX )
358 {
359 if ( ! m_listQueue[index].IsEmpty() )
360 {
361 TYP t = m_listQueue[index].Get(0);
362 m_listQueue[index].Remove(0);
363 return t;
364 }
365 }
366 ASSERT0(false, "CPriorityQueueT::Take()", "キューが空の時取得操作されました。");
367 throw CEmptyException();
368 }
369
378 virtual size_t TakeElements(size_t size, TYP* P = NULL)
379 {
380 EXCLUSIVE(this);
381 if ( size > GetSize() )
382 {
383 return INVALID_SIZE;
384 }
385 if ( P != NULL )
386 {
387 loop ( i, size )
388 {
389 *P++ = Take();
390 }
391 }
392 else
393 {
394 loop ( i, size )
395 {
396 Take();
397 }
398 }
399 return size;
400 }
401};
402
403
404
405}; // TNB
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
キュー型情報管理関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
取得要素(空き)無し例外
Definition: TnbException.h:107
リスト式キュー型情報管理テンプレート
Definition: TnbListQueue.h:52
リスト型情報管理テンプレート
Definition: TnbList.h:61
virtual size_t GetSize(void) const
[取得] 要素数取得
Definition: TnbList.h:316
virtual bool Remove(INDEX index)
[削除] 要素一つ削除
Definition: TnbList.h:341
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbList.h:301
virtual bool RemoveAll(void)
[削除] 全要素削除
Definition: TnbList.h:395
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加
Definition: TnbList.h:328
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbList.h:307
優先順位付キュー型情報管理テンプレート
virtual size_t GetSize(void) const
[取得] 要素数取得
INDEX AddEx(int iLevel, const TYP &t)
[追加] レベル別要素追加.
INDEX Add(int iLevel, const TYP &t)
[追加] レベル別要素追加.
TYP Take(int iLevel)
[取得] レベル別先頭要素取り出し.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
virtual size_t TakeElements(size_t size, TYP *P=NULL)
[取得] 複数要素取り出し
virtual bool RemoveAll(void)
[削除] データ全削除.
virtual size_t AddElements(size_t size, const TYP *P=NULL)
[追加] 複数要素追加.
size_t Append(int iLevel, const IConstCollectionT< TYP > &c)
[追加] レベル別追加.
virtual INDEX Add(const TYP &t)
[追加] 要素追加.
virtual TYP Take(void)
[取得] 先頭要素取り出し.
virtual void Unlock(void) const
[排他] アンロック
virtual const TYP * m_GetConstPointer(INDEX index) const
[取得] 要素アドレス取得
CPriorityQueueT(int iLevel=3)
コンストラクタ
size_t GetSize(int iLevel) const
[取得] レベル別要素数取得
virtual TYP * m_GetPointer(INDEX index)
[取得] 要素アドレス取得
size_t AddElements(int iLevel, size_t size, const TYP *P=NULL)
[追加] レベル別複数要素追加.
例外ベースクラス
Definition: TnbException.h:36
void OnCatch(void) const
[表示] 内容表示
Definition: TnbException.h:69
情報群管理操作インターフェース拡張テンプレート
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2
virtual size_t Append(const IConstCollectionT< TYP > &c)
[追加] 追加.
情報群管理インターフェーステンプレート
bool IsEmpty(void) const
[確認] 要素の有無確認.
キュー型情報管理インターフェーステンプレート
Definition: TnbQueue.h:43