1 /*--------------------------------------------------------------------------
2 Project: HorizonSDK
3 File: rdt_Queue.h
4
5 Copyright 2009 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2010-04-30#$
14 $Rev: 15289 $
15 $Author: hiratsu_daisuke $
16 *-------------------------------------------------------------------------*/
17
18 #include "stdafx.h"
19
20 #ifndef NN_RDT_QUEUE_H_
21 #define NN_RDT_QUEUE_H_
22
23 #include "rdt_Utility.h"
24
25 namespace nn { namespace rdt { namespace CTR {
26
27
28 /*!
29 @brief これは、キューを表現するテンプレートクラスです。
30 本当ならSTLを使って済ませたかったのですが、CTR-SDKライブラリ内部では
31 STLを使ってはいけないので、自作することにしました。
32 */
33 template <class T, size_t N>
34 class Queue{
35 public:
36 /*!
37 @brief 初期化します。
38 */
39 Queue(void);
40
41 /*!
42 @brief 解放します。
43 */
44 ~Queue(void);
45
46 /*!
47 @brief キューがカラッポかどうかを判定します。
48 */
49 bool IsEmpty(void) const;
50
51 /*!
52 @brief キューの要素数を得ます。
53 */
54 size_t Size(void) const;
55
56 /*!
57 @brief キューの後方に詰めます。
58 */
59 void Push(const T &value);
60
61 /*!
62 @brief キューの先頭の要素を削除します。
63 */
64 void Pop(void);
65
66 /*!
67 @brief キューの先端の要素を得ます。
68 */
69 const T& Front(void) const;
70
71 /*!
72 @brief キューの末端の要素を得ます。
73 */
74 const T& Back(void) const;
75
76 /*!
77 @brief キューを初期状態に戻します。
78 */
79 void Clear(void);
80
81 /*!
82 @brief デバッグ用機能。中身をプリントします。
83 */
84 void PrintDebugInfo(void) const;
85
86 private:
87 /*!
88 @brief コピーコンストラクタは封印します。
89 */
90 Queue (const Queue&);
91
92 /*!
93 @brief 代入演算子は封印します。
94 */
95 Queue& operator=(const Queue&);
96
97 // 数字の若い方が、先頭側。
98 T m_array[N];
99 size_t m_front; // 先頭の要素を指すインデックス
100 size_t m_back; // 後方に詰める時の位置を指すインデックス
101
102 // m_frontとm_backが等しいとき、キューは「カラ」であるとする。
103 };
104
105 template <class T, size_t N>
Queue(void)106 Queue<T, N>::Queue(void)
107 {
108 Clear();
109 }
110
111 // デストラクタ
112 template <class T, size_t N>
~Queue(void)113 Queue<T, N>::~Queue(void)
114 {
115 }
116
117
118 template <class T, size_t N>
IsEmpty(void)119 bool Queue<T, N>::IsEmpty(void) const
120 {
121 return m_front==m_back;
122 }
123
124
125 template <class T, size_t N>
Size(void)126 size_t Queue<T, N>::Size(void) const
127 {
128 return (m_back - m_front + N) % N;
129 }
130
131
132 template <class T, size_t N>
Push(const T & value)133 void Queue<T, N>::Push(const T &value)
134 {
135 ASSERTMSG((m_back + 1) % N != m_front, "You can not Push() anymore because queue is full.");
136
137 m_array[m_back] = value;
138 m_back = (m_back + 1) % N;
139 }
140
141
142 template <class T, size_t N>
Pop(void)143 void Queue<T, N>::Pop(void)
144 {
145 ASSERTMSG(!IsEmpty(), "You attempt to execute Pop(), but queue is empty.");
146
147 m_front = (m_front + 1) % N;
148 }
149
150
151 template <class T, size_t N>
Front(void)152 const T& Queue<T, N>::Front(void) const
153 {
154 return m_array[m_front];
155 }
156
157
158 template <class T, size_t N>
Back(void)159 const T& Queue<T, N>::Back(void) const
160 {
161 return m_array[(m_back - 1 + N) % N];
162 }
163
164
165 template <class T, size_t N>
Clear(void)166 void Queue<T, N>::Clear(void)
167 {
168 m_front = 0;
169 m_back = 0;
170 }
171
172
173 // Tが基本型でないと、このPrintDebugInfo()は機能しない…。
174 template <class T, size_t N>
PrintDebugInfo(void)175 void Queue<T, N>::PrintDebugInfo(void) const
176 {
177 if(IsEmpty())
178 {
179 LOG("Queue is empty.\n");
180 }
181 else
182 {
183 for(u32 i=0; i<Size(); ++i)
184 {
185 LOG("[%d] : %d\n", i, m_array[(m_front + i) % N]);
186 }
187 }
188 }
189
190 }}} // namespace nn::rdt::CTR
191
192 #endif // end of NN_RDT_QUEUE_H_
193