|
|
nono 0.2.0
//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//
#pragma once
#include "header.h"
#include <vector>
// std::vector だが所々 queue っぽく使いたい。
// イーサネットフレームの受信のところで使用する。
// 配列からさくっとコンストラクト出来て(a)、
// 先頭から1要素ずつ取り出していきたい(b)。
// std::vector は a は得意だが、b は効率が悪すぎる。
// std::deque は b は近いことは効率よくできるが、a が効率悪い。
// qvector<T>
// std::vector と std::deque の都合のいいところだけを真似した
// フレーム受信処理に都合のいいクラス。
template<class T>
class qvector
{
public:
qvector() { }
// 配列の先頭と末尾+1を指定するコンストラクタ
qvector(T *begin, T *end) {
v = std::vector<T>(begin, end);
cur = 0;
}
// 配列の末尾に追加する。
void append(const T val) {
v.push_back(val);
}
// 先頭の1要素を削除して、返す。
// 空の場合は T() を返す。
T dequeue() {
if (__predict_true(cur < v.size())) {
return v[cur++];
} else {
return T();
}
}
// 配列の中身を読み取る。
T peek(int i) const {
return v[i];
}
// 現在の要素数を返す。
size_t size() const {
return v.size() - cur;
}
// 空なら true を返す。
bool empty() const {
return (cur == v.size());
}
// クリアする。
void clear() {
v.clear();
cur = 0;
}
private:
std::vector<T> v {};
int cur {};
};
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.