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

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

unix.superglobalmegacorp.com

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