Annotation of nono/lib/qvector.h, revision 1.1.1.4

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: };

unix.superglobalmegacorp.com

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