void shift_to_front_by()

in fatal/container/circular_queue.h [310:349]


  void shift_to_front_by(size_type count, Shifter &&shifter = Shifter()) {
    assert(!queue_.empty());

    FATAL_ASSUME_LE(count, size_);
    if (count == size_) {
      return;
    }
    FATAL_ASSUME_LT(count, size_);

    FATAL_ASSUME_LE(size_, queue_.size());
    if (size_ == queue_.size()) {
      // no empty slots, just need to adjust the offset
      if (offset_ < count) {
        FATAL_ASSUME_LT(count, queue_.size());
        offset_ += queue_.size() - count;
      } else {
        offset_ -= count;
      }
      FATAL_ASSUME_LT(offset_, queue_.size());
    } else {
      // empty slots, move front chunk to back
      while (count--) {
        if (offset_) {
          --offset_;
        } else {
          offset_ = queue_.size() - 1;
        }
        FATAL_ASSUME_LT(offset_, queue_.size());

        auto &from = queue_[loose_real_index(size_)].value;
        shifter(
          std::addressof(queue_[offset_].value),
          std::move(from)
        );
        from.~value_type();
      }
      FATAL_ASSUME_LT(offset_, queue_.size());
//*/
    }
  }