Annotation of nono/vm/eventqueue.h, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2021 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: #pragma once
        !             8: 
        !             9: #include <queue>
        !            10: 
        !            11: //
        !            12: // イベントキュー
        !            13: //
        !            14: 
        !            15: // 比較関数
        !            16: template <class T>
        !            17: class event_comp_t {
        !            18:  public:
        !            19:        inline bool operator()(const T& a, const T& b) const
        !            20:        {
        !            21:                return a->vtime > b->vtime;
        !            22:        }
        !            23: };
        !            24: using event_comp = event_comp_t<Event *>;
        !            25: 
        !            26: // イベントキュー
        !            27: class EventQueue
        !            28:        : public std::priority_queue<Event *, std::vector<Event *>, event_comp>
        !            29: {
        !            30:        using inherited =
        !            31:                std::priority_queue<Event *, std::vector<Event *>, event_comp>;
        !            32: 
        !            33:  public:
        !            34:        EventQueue()
        !            35:                : inherited((event_comp()))
        !            36:        {
        !            37:        }
        !            38: 
        !            39:        ~EventQueue()
        !            40:        {
        !            41:        }
        !            42: 
        !            43:        // キューから ev と(このオブジェクトのポインタが)一致する要素を外し
        !            44:        // true を返す。なければ何もせず false を返す。
        !            45:        // (独自メソッドなので大文字で始めている)
        !            46:        bool Erase(Event *ev)
        !            47:        {
        !            48:                for (auto it = c.begin(); it != c.end(); ++it) {
        !            49:                        Event *e = *it;
        !            50:                        if (e == ev) {
        !            51:                                // 見つけた要素を末尾に移動
        !            52:                                std::pop_heap(it, c.end(), comp);
        !            53:                                // 末尾を削除
        !            54:                                c.pop_back();
        !            55:                                // 再構築
        !            56:                                std::make_heap(c.begin(), c.end(), comp);
        !            57:                                return true;
        !            58:                        }
        !            59:                }
        !            60:                return false;
        !            61:        }
        !            62: };

unix.superglobalmegacorp.com

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