Итак, я чувствую, что должно быть хорошее встроенное решение для этого в C ++, но я не уверен, что это такое.
Мне нужна очередь (идеально ориентированная на многопотоковое исполнение, но я могу самостоятельно обернуть ее в синхронизацию, если это необходимо), которая эффективно обрабатывает группы байтов, позволяя чтение / запись разных размеров.
так, интерфейс выглядит, например,
//removes the first bytesToRead elements from the front of the queue and places them in array; returns the actual number of bytes dequeued
int dequeue(unsigned char *array, int bytesToRead)
//Adds bytesToWrite elements from array to the end of the queue; does nothing and returns 0 if this would exceed the queue's max size
int enqueue(unsigned char *array, int bytesToWrite)
Я могу написать сам без особых затруднений, но, похоже, это должно быть что-то, что легко сделать с полки.
Лучшая вещь в STL выглядит так, как будто это может быть stringbuf - мне нужно было бы вручную связать вызовы sgetc / pubseekoff, но, похоже, это будет работать.
Я собираюсь сделать это как замену текущей реализации очереди, которая является проблемой производительности; чтение в этой реализации O (N) на количество данных в очереди. (Это очень наивная реализация - каждая очередь приводит к копии массива оставшихся данных в очереди.)
Дополнительные требования (при необходимости я могу реализовать их в оболочке):
-У меня должна быть возможность указать максимальный размер буфера
-Читать операции должны восстановить все доступные данные, если доступно меньше данных, чем было запрошено
Операции записи не должны делать ничего, если запрашиваемая запись превысит максимальный размер и вернет индикатор ошибки
Итак, мои вопросы:
1) достаточно ли stringbuf? Относятся ли операции чтения / записи O (1) к объему данных в буфере, предполагая, что изменение размера не требуется? (очевидно, они потенциально будут O (n) на количество запрошенных предметов.)
2) Есть ли какой-то другой класс, которого я не вижу, которого будет достаточно?
Заранее спасибо!