|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2019 [email protected] ! 4: // ! 5: ! 6: #pragma once ! 7: ! 8: #include <vector> ! 9: ! 10: // std::vector だが所々 queue っぽく使いたい。 ! 11: // イーサネットフレームの受信のところで使用する。 ! 12: // 配列からさくっとコンストラクト出来て(a)、 ! 13: // 先頭から1要素ずつ取り出していきたい(b)。 ! 14: // std::vector は a は得意だが、b は効率が悪すぎる。 ! 15: // std::deque は b は近いことは効率よくできるが、a が効率悪い。 ! 16: ! 17: // qvector<T> ! 18: // std::vector と std::deque の都合のいいところだけを真似した ! 19: // フレーム受信処理に都合のいいクラス。 ! 20: ! 21: template<class T> ! 22: class qvector ! 23: { ! 24: public: ! 25: qvector() { } ! 26: // 配列の先頭と末尾+1を指定するコンストラクタ ! 27: qvector(T *begin, T *end) { ! 28: v = std::vector<T>(begin, end); ! 29: cur = 0; ! 30: } ! 31: // コピーコンストラクタ ! 32: qvector(const qvector& obj) { ! 33: v = obj.v; ! 34: cur = obj.cur; ! 35: } ! 36: ! 37: // 先頭の1要素を削除して、返す。 ! 38: // 空の場合の動作は不定。 ! 39: T pop() { ! 40: if (__predict_true(cur < v.size())) { ! 41: return v[cur++]; ! 42: } else { ! 43: // XXX 動作不定 ! 44: return 0; ! 45: } ! 46: } ! 47: ! 48: // 現在の要素数を返す。 ! 49: size_t size() { ! 50: return v.size() - cur; ! 51: } ! 52: ! 53: // 空なら true を返す。 ! 54: bool empty() { ! 55: return (cur == v.size()); ! 56: } ! 57: ! 58: // クリアする。 ! 59: void clear() { ! 60: v.clear(); ! 61: cur = 0; ! 62: } ! 63: ! 64: private: ! 65: std::vector<T> v {}; ! 66: int cur = 0; ! 67: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.