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_ {};