|
|
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:
1.1.1.4 ! root 34: // 配列の末尾に追加する。
! 35: void append(const T val) {
! 36: v.push_back(val);
! 37: }
! 38:
1.1 root 39: // 先頭の1要素を削除して、返す。
1.1.1.4 ! root 40: // 空の場合は T() を返す。
! 41: T dequeue() {
1.1 root 42: if (__predict_true(cur < v.size())) {
43: return v[cur++];
44: } else {
1.1.1.4 ! root 45: return T();
1.1 root 46: }
47: }
48:
1.1.1.4 ! root 49: // 配列の中身を読み取る。
! 50: T peek(int i) const {
! 51: return v[i];
! 52: }
! 53:
1.1 root 54: // 現在の要素数を返す。
1.1.1.4 ! root 55: size_t size() const {
1.1 root 56: return v.size() - cur;
57: }
58:
59: // 空なら true を返す。
1.1.1.4 ! root 60: bool empty() const {
1.1 root 61: return (cur == v.size());
62: }
63:
64: // クリアする。
65: void clear() {
66: v.clear();
67: cur = 0;
68: }
69:
70: private:
71: std::vector<T> v {};
1.1.1.3 root 72: int cur {};
1.1 root 73: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.