17 struct Ptr { ForwardIterator it, end; };
18 ssize_t n_queues = 0, current = -1;
19 Priority first = {}, next = {};
21 QueueMultiplexer () {}
22 template<
class IterableContainer>
bool
30 for (
size_t i = 0; i < queues.size(); i++)
31 if (queues[i]) [[likely]]
34 ptrs[n_queues].end =
std::end (*queues[i]);
35 if (ptrs[n_queues].it != ptrs[n_queues].end)
42 count_pending() const noexcept
45 for (ssize_t i = 0; i < n_queues; i++)
46 c += ptrs[i].end - ptrs[i].it;
57 if (!more()) [[unlikely]]
59 return *ptrs[current].it;
65 const ValueType &result = *ptrs[current].it++;
66 if (ptrs[current].it == ptrs[current].end) [[unlikely]]
68 if (current < n_queues - 1) [[unlikely]]
69 ptrs[current] = ptrs[n_queues - 1];
73 else if (QueueMultiplexer_priority (*ptrs[current].it)
81 using difference_type =
ssize_t;
87 bool more ()
const {
return mux_ && mux_->more(); }
88 friend bool operator== (
const Iter &a,
const Iter &b) {
return a.more() == b.more(); }
89 value_type& operator* ()
const {
return mux_ ? mux_->peek() : empty(); }
90 Iter operator++ (
int) {
Iter copy (*
this); this->operator++();
return copy; }
93 if (mux_) [[likely]] {
94 if (mux_->more()) [[likely]]
104 iterator end () {
return {}; }
109 if (n_queues == 0) [[likely]]
114 for (ssize_t i = 0; i < n_queues; i++)
116 const Priority prio = QueueMultiplexer_priority (*ptrs[i].it);
123 else if (prio < next)
128 static const ValueType&
129 empty() noexcept ASE_NOINLINE
131 static const ValueType empty_ {};