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