16 struct Ptr { ForwardIterator it, end; };
17 ssize_t n_queues = 0, current = -1;
18 Priority first = {}, next = {};
20 QueueMultiplexer () {}
21 template<
class IterableContainer>
bool
29 for (
size_t i = 0; i < queues.size(); i++)
30 if (queues[i]) [[likely]]
33 ptrs[n_queues].end =
std::end (*queues[i]);
34 if (ptrs[n_queues].it != ptrs[n_queues].end)
41 count_pending() const noexcept
44 for (ssize_t i = 0; i < n_queues; i++)
45 c += ptrs[i].end - ptrs[i].it;
56 if (!more()) [[unlikely]]
58 return *ptrs[current].it;
64 const ValueType &result = *ptrs[current].it++;
65 if (ptrs[current].it == ptrs[current].end) [[unlikely]]
67 if (current < n_queues - 1) [[unlikely]]
68 ptrs[current] = ptrs[n_queues - 1];
72 else if (QueueMultiplexer_priority (*ptrs[current].it)
80 using difference_type =
ssize_t;
86 bool more ()
const {
return mux_ && mux_->more(); }
87 friend bool operator== (
const Iter &a,
const Iter &b) {
return a.more() == b.more(); }
88 value_type& operator* ()
const {
return mux_ ? mux_->peek() : empty(); }
89 Iter operator++ (
int) {
Iter copy (*
this); this->operator++();
return copy; }
92 if (mux_) [[likely]] {
93 if (mux_->more()) [[likely]]
103 iterator end () {
return {}; }
108 if (n_queues == 0) [[likely]]
113 for (ssize_t i = 0; i < n_queues; i++)
115 const Priority prio = QueueMultiplexer_priority (*ptrs[i].it);
122 else if (prio < next)
127 static const ValueType&
128 empty() noexcept ASE_NOINLINE
130 static const ValueType empty_ {};