17 #ifndef DISK_RING_BUFFER_H
18 #define DISK_RING_BUFFER_H
20 #include <a_util/memory.h>
39 template <
typename ADDITIONAL_DATA = u
int8_t, u
int8_t alignment = 1>
92 a_util::memory::MemoryBuffer _alignment_buffer;
107 _start_offset(start_offset),
111 _callback(drop_callback)
114 _current_pos = start_offset;
117 __pragma(warning(push))
118 __pragma(warning(disable:4127))
122 _alignment_buffer.allocate(alignment - 1);
126 __pragma(warning(pop))
137 return _current_size;
147 throw std::runtime_error(
"history already started wrapping around");
150 _max_size = _current_size;
164 throw std::runtime_error(
"already appending");
170 _bookkeeping =
false;
172 if (_rear_item.
file_pos == -1 && !_items.empty())
175 _rear_item = _items.back();
180 *rear_data_item = _rear_item;
187 *last_data_item = _items.back();
191 *last_data_item =
Item();
204 const ADDITIONAL_DATA& additional,
FilePos* file_pos =
nullptr)
208 item.dataSize = data_size;
220 const ADDITIONAL_DATA& additional,
FilePos* file_pos =
nullptr)
222 size_t data_size = 0;
223 for (
size_t piece = 0; piece < count; ++piece)
228 if (_max_size && !_items.empty())
230 if (_current_pos +
static_cast<FileSize>(data_size) > _max_size)
234 _current_size = _current_pos;
236 _rear_item = _items.back();
239 while (_items.front().file_pos >= _current_pos)
244 _current_pos = _items.front().file_pos;
251 *file_pos = _current_pos;
254 FilePos write_pos = _current_pos;
256 for (
size_t piece = 0; piece < count; ++piece)
258 _file->
writeAll(pieces[piece].data,
static_cast<int>(pieces[piece].data_size));
261 _current_pos += data_size;
265 if (_current_pos > _current_size)
267 _current_size = _current_pos;
274 item.
size = data_size;
277 _items.push_back(item);
282 while (_items.size() > 1 &&
283 _items.front().file_pos >= start &&
284 _items.front().file_pos <
end)
298 _rear_item = _items.back();
301 _current_size = _current_pos;
313 return _items.begin();
332 FilePos mod = _current_pos % alignment;
335 FilePos fill = alignment - mod;
336 _file->
writeAll(_alignment_buffer.getPtr(),
337 static_cast<size_t>(fill));
338 _current_pos += fill;
351 Item& item = _items.front();
353 if (_items.size() > 1)
357 _callback->
onDrop(item, *next);
Definition: fileringbuffer.h:58
virtual void onDrop(const Item &dropped_item, const Item &next_item)=0
Definition: fileringbuffer.h:41
void startWrappingAround()
Definition: fileringbuffer.h:143
const_iterator begin() const
Definition: fileringbuffer.h:311
void fillForAlignment()
Definition: fileringbuffer.h:330
void appendItem(const ItemPiece *pieces, size_t count, const ADDITIONAL_DATA &additional, FilePos *file_pos=nullptr)
Definition: fileringbuffer.h:219
const FileSize & getCurrentSize()
Definition: fileringbuffer.h:135
void startAppending(Item *rear_data_item=nullptr, Item *last_data_item=nullptr)
Definition: fileringbuffer.h:160
void popFront()
Definition: fileringbuffer.h:345
void appendItem(const void *data, size_t data_size, const ADDITIONAL_DATA &additional, FilePos *file_pos=nullptr)
Definition: fileringbuffer.h:203
std::deque< Item > Items
Typedef for convienient access.
Definition: fileringbuffer.h:79
Items::const_iterator const_iterator
An const iterator in the buffer.
Definition: fileringbuffer.h:81
FileRingBuffer(File *file, FilePos start_offset=0, FileSize max_size=0, DropCallback *drop_callback=nullptr)
Definition: fileringbuffer.h:104
const_iterator end() const
Definition: fileringbuffer.h:320
@ fp_end
offsets are measured from the end of the file
Definition: file.h:187
@ fp_begin
offsets are measured from the beginning of the file
Definition: file.h:181
FilePos setFilePos(FilePos offset, FilePosRef move_mode)
FilePos getFilePos() const
void truncate(FilePos size)
void writeAll(const void *buffer, size_t buffer_size)
int64_t FilePos
Type for a file position.
Definition: file.h:37
void memZero(void *data, size_t bytes)
Helper function to set a memory buffer to zero.
Definition: file.h:519
FilePos FileSize
Type for the file size.
Definition: file.h:41
Definition: fileringbuffer.h:73
size_t data_size
The size of the piece.
Definition: fileringbuffer.h:75
const void * data
The data of the piece.
Definition: fileringbuffer.h:74
Definition: fileringbuffer.h:47
FilePos file_pos
The file position of the items data.
Definition: fileringbuffer.h:49
ADDITIONAL_DATA additional
additional bookkeeping data
Definition: fileringbuffer.h:51
size_t size
The size of the items data.
Definition: fileringbuffer.h:50