Я пишу кольцевой (циклический) буферный класс, который, насколько это возможно, соответствует «STL-укладам вещей».
Я использую знакомые имена функций, такие как pop ()и front (), управляют памятью с помощью std :: allocator и имеют подкласс std :: iterator, так что я могу использовать алгоритмы, такие как std :: sort ().Для моей текущей реализации позиции заголовка и хвоста буфера представлены как интегральные смещения от базового адреса выделенной памяти, то есть как значения size_t.Пока не указателями.
Из-за циклической природы буфера индексы / смещения должны быть перенесены, если они немного выходят за пределы емкости буфера.Я не хочу использовать оператор остатка, если могу помочь, поэтому при условии, что -capacity
<= <code>index <<code>capacity * 2, вот такая функция, которую я мог бы написать:
constexpr size_t capacity = 8; // to show this is size_t
size_t wrap(T index) {
if (index < 0)
return capacity + index;
else if (index >= capacity)
return index - capacity;
else
return index;
}
Я знаю, что:
- Возвращаемое значение всегда будет неотрицательным, и желательно, чтобы size_t был дружественным к STL.
index
, конечно, может быть отрицательным.
Каким был бы разумный тип для T, одновременно сводя к минимуму необходимость приведений в функции?И стоит ли использовать указатели, а не целочисленные индексы?