File:  [Isaki's NoNo m68k/m88k emulator] / nono / lib / qvector.h
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:04:54 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v014, v013, v012, v011, HEAD
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 {};
};

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.