|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "header.h" ! 7: #include <vector> ! 8: ! 9: // 固定長キュー ! 10: // std::queue では出来ないことがいくつかあるので仕方なく車輪の再開発。 ! 11: // ! 12: // T 型で上限 capacity 個のキュー。 ! 13: // スレッドセーフではない。 ! 14: template <typename T, int capacity> ! 15: class FixedQueue ! 16: { ! 17: public: ! 18: // コンストラクタ ! 19: FixedQueue() ! 20: : buf(capacity) ! 21: { ! 22: Clear(); ! 23: } ! 24: ! 25: // デストラクタ ! 26: virtual ~FixedQueue() { ! 27: } ! 28: ! 29: // 空にする ! 30: void Clear() { ! 31: start = 0; ! 32: length = 0; ! 33: } ! 34: ! 35: // 追加 ! 36: bool Enqueue(T val) { ! 37: if (length < capacity) { ! 38: // 空きがあれば追加 ! 39: buf[(start + length) % capacity] = val; ! 40: length++; ! 41: return true; ! 42: } else { ! 43: return false; ! 44: } ! 45: } ! 46: ! 47: // 取り出し ! 48: // 要素が1つ以上あれば *outp に取り出して true を返す。 ! 49: // キューが空なら false を返す。 ! 50: bool Dequeue(T *outp) { ! 51: if (length > 0) { ! 52: // 1つ以上あれば取り出し ! 53: *outp = buf[start]; ! 54: start = (start + 1) % capacity; ! 55: length--; ! 56: return true; ! 57: } else { ! 58: return false; ! 59: } ! 60: } ! 61: ! 62: // 取り出し ! 63: // 先頭の要素を取り出して返す。 ! 64: // キューが空の時に呼ぶと不定値が返る。 ! 65: T Dequeue() { ! 66: T val = buf[start]; ! 67: if (length > 0) { ! 68: start = (start + 1) % capacity; ! 69: length--; ! 70: } ! 71: return val; ! 72: } ! 73: ! 74: // 現在の要素数を取得 ! 75: uint Length() const { ! 76: return length; ! 77: } ! 78: ! 79: // 要素を覗き見る。 ! 80: // idx は 0 .. length-1 までで、0 がキューの先頭。 ! 81: T Peek(int idx) { ! 82: // XXX 範囲チェックすべきだがとりあえず ! 83: return buf[(start + idx) % capacity]; ! 84: } ! 85: ! 86: private: ! 87: std::vector<T> buf; // バッファ ! 88: uint start = 0; // 開始位置 ! 89: uint length = 0; // 現在有効な長さ ! 90: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.