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());
//*/
}
}