|
|
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.