collection2  v0.6.0
Loading...
Searching...
No Matches
queue.hpp
1//
2// キュー
3//
4
5#ifndef _COLLECTION2_QUEUE_H_
6#define _COLLECTION2_QUEUE_H_
7
8#include <stddef.h>
9
10#include "common.hpp"
11
12namespace collection2 {
13
20template <typename Element, typename Size = size_t>
21class Queue {
22 private:
26 Element* const internalData;
27
31 Size internalDataSize;
32
36 Size head = 0;
37
41 Size tail = 0;
42
46 Size count = 0;
47
48 public:
56 Queue(Element* const data, const Size& dataSize);
57
58 Queue(const Queue&) = delete;
59 Queue& operator=(const Queue&) = delete;
60
61 ~Queue() = default;
62
69 OperationResult enqueue(const Element& data);
70
77 OperationResult dequeue(Element* const data);
78
84 Size capacity() const {
85 return internalDataSize;
86 }
87
93 Size amount() const {
94 return count;
95 }
96
102 bool hasSpace() const {
103 return count < internalDataSize;
104 }
105
111 bool isEmpty() const {
112 return count == 0;
113 }
114};
115
116template <typename Element, typename Size>
117Queue<Element, Size>::Queue(Element* const data, const Size& dataSize) : internalData(data) {
118 // ゼロ長のキューなら何もしない
119 if (dataSize == 0) {
120 internalDataSize = dataSize;
121 return;
122 }
123
124 // 与えられたサイズを上回らない最大の2の冪数を探す
125 unsigned char maxbitPos = 0;
126 Size size = dataSize;
127 while ((size >>= 1) != 0) {
128 maxbitPos++;
129 }
130 internalDataSize = 1 << maxbitPos;
131};
132
133template <typename Element, typename Size>
135 // キューがいっぱいなら戻る
136 if (!hasSpace()) {
137 return OperationResult::Overflow;
138 }
139
140 // tailの位置にデータを書き込む
141 *(internalData + tail) = data;
142
143 tail = (tail + 1) & (internalDataSize - 1);
144 count++;
145
146 return OperationResult::Success;
147}
148
149template <typename Element, typename Size>
151 // キューが空なら戻る
152 if (isEmpty()) {
153 return OperationResult::Empty;
154 }
155
156 // 読み出して渡す
157 *data = *(internalData + head);
158
159 head = (head + 1) & (internalDataSize - 1);
160 count--;
161
162 return OperationResult::Success;
163}
164
165} // namespace collection2
166
167#endif
キュー
Definition: queue.hpp:21
Queue(Element *const data, const Size &dataSize)
内部データを扱う領域とそのサイズを指定してキューを初期化
Definition: queue.hpp:117
Size amount() const
現在キュー内にあるデータ数を返す
Definition: queue.hpp:93
OperationResult enqueue(const Element &data)
キューにデータを追加
Definition: queue.hpp:134
bool isEmpty() const
キューが空かどうか
Definition: queue.hpp:111
OperationResult dequeue(Element *const data)
キューからデータを取り出し
Definition: queue.hpp:150
Size capacity() const
キューの全体長を返す
Definition: queue.hpp:84
bool hasSpace() const
キューに値を追加できるか
Definition: queue.hpp:102
OperationResult
コレクション操作結果
Definition: common.hpp:14