OROCHI
 
Loading...
Searching...
No Matches
GxP2PQueue.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_P2P_NAMESPACE_BEGIN()
14
15//===========================================================================
17//===========================================================================
18template <typename T, size_t N>
20{
21 //-----------------------------------------------------------
23 //-----------------------------------------------------------
25public:
29 virtual ~GxP2PQueue(void);
30
32 //-----------------------------------------------------------
34 //-----------------------------------------------------------
36public:
38 b32 queue(const T& input);
40 b32 queue(GX_CSTR input, size_t size);
41
43 b32 dequeue(T& output);
44
46 //-----------------------------------------------------------
48 //-----------------------------------------------------------
50public:
52 const void setOverWrite(b32 isOverWrite) { _isOverWrite = isOverWrite; }
54 constexpr nu32 getQueueNum(void) const { return _num; }
55#if GX_DEVELOP
57 constexpr nu32 getMaxQueueNum(void) const { return _maxQueueNum; }
58#endif // GX_DEVELOP
59
61 //-----------------------------------------------------------
63 //-----------------------------------------------------------
65protected:
66 T _buffer[N];
67 size_t _bufferSize;
68 nu32 _head;
69 nu32 _tail;
70 nu32 _num;
72#if GX_DEVELOP
73 nu32 _maxQueueNum;
74#endif // GX_DEVELOP
75
77};
78
79//-------------------------------------------------------------------
80// コンストラクタ
81//-------------------------------------------------------------------
82template <typename T, size_t N>
84: _bufferSize(N)
85, _head(0)
86, _tail(0)
87, _num(0)
88, _isOverWrite(true)
89#if GX_DEVELOP
90, _maxQueueNum(0)
91#endif // GX_DEVELOP
92{
93 GX_MEMSET(_buffer, 0, sizeof(_buffer));
94}
95
96//-------------------------------------------------------------------
97// デストラクタ
98//-------------------------------------------------------------------
99template <typename T, size_t N>
103
104//-------------------------------------------------------------------
105// キューに格納
108//-------------------------------------------------------------------
109template <typename T, size_t N>
111{
112 return queue(reinterpret_cast<GX_CSTR>(&input), sizeof(T));
113}
114
115//-------------------------------------------------------------------
116// キューに格納
120//-------------------------------------------------------------------
121template <typename T, size_t N>
122b32 GxP2PQueue<T,N>::queue(GX_CSTR input, size_t size)
123{
124 GXP2P_DEBUG_ASSERT(input, "input is nullptr\n");
125 GXP2P_DEBUG_ASSERT(size <= sizeof(T), "QueueBuffer Overflow (size:%d > blockSize:%d)\n", size, sizeof(T));
126
127 b32 result = true;
128
129 // サイズ0 → 格納しない
130 if( !size )
131 {
132 return true;
133 }
134
135 // バッファあふれ処理
136 if( _num >= N )
137 {
138 if( !_isOverWrite )
139 {
140 // 上書きしない → そのまま終了
141 return false;
142 }
143 else
144 {
145 // 上書きする → 一番古いデータを上書き
146 result = false; // 返り値:FALSE
147 dequeue(_buffer[_head]); // 1つ取り出す (取り出し先は先頭)
148 }
149 }
150
151 // キューに格納
152 T* pFree = &_buffer[_tail]; // 空きバッファ取得
153 GX_MEMCPY(pFree, input, size);
154
155 // キューを進める
156 ++ _num;
157 ++ _tail;
158 if( _tail >= N )
159 {
160 _tail = 0;
161 }
162
163#if GX_DEVELOP
164 // キュー格納数最高到達点保持 (デバッグ用)
165 if( _maxQueueNum < _num )
166 {
167 _maxQueueNum = _num;
168 GXP2P_FUNCTION_PRINT("[%s] Queue Max Num Update (%d : max[%d])\n", _maxQueueNum, N);
169 }
170#endif // GX_DEVELOP
171
172 return result;
173}
174
175//-------------------------------------------------------------------
176// キューから取得
179//-------------------------------------------------------------------
180template <typename T, size_t N>
182{
183 // キューが空なら終了
184 if( !_num )
185 {
186 return false;
187 }
188
189 // キューから出力先にコピー
190 GX_MEMCPY(&output, &_buffer[_head], sizeof(T));
191
192 // キューを減らす
193 -- _num;
194 ++ _head;
195 if( _head >= N )
196 {
197 _head = 0;
198 }
199
200 return true;
201}
202
203GX_P2P_NAMESPACE_END()
#define GXP2P_DEBUG_ASSERT(a,...)
アサートマクロ
Definition GxP2PDebug.h:233
Queueクラス
Definition GxP2PQueue.h:20
GxP2PQueue(void)
デフォルトコンストラクタ
Definition GxP2PQueue.h:83
T _buffer[N]
バッファ
Definition GxP2PQueue.h:66
nu32 _head
先頭位置
Definition GxP2PQueue.h:68
b32 dequeue(T &output)
キューから取得
Definition GxP2PQueue.h:181
nu32 _num
現在格納数
Definition GxP2PQueue.h:70
b32 _isOverWrite
オーバーフロー時上書きフラグ
Definition GxP2PQueue.h:71
nu32 _tail
終端位置
Definition GxP2PQueue.h:69
size_t _bufferSize
バッファサイズ
Definition GxP2PQueue.h:67
const void setOverWrite(b32 isOverWrite)
オーバーフロー時上書き設定
Definition GxP2PQueue.h:52
virtual ~GxP2PQueue(void)
デストラクタ
Definition GxP2PQueue.h:100
b32 queue(const T &input)
キューに格納
Definition GxP2PQueue.h:110
constexpr nu32 getQueueNum(void) const
キュー格納数取得
Definition GxP2PQueue.h:54
b32 queue(GX_CSTR input, size_t size)
キューに格納
Definition GxP2PQueue.h:122
32bitブーリアン
Definition GxDefine.h:173