Функция кольцевого буфера () - PullRequest
0 голосов
/ 10 июля 2019

Я пишу кольцевой (циклический) буферный класс, который, насколько это возможно, соответствует «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, одновременно сводя к минимуму необходимость приведений в функции?И стоит ли использовать указатели, а не целочисленные индексы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...