17#ifndef DISK_RING_BUFFER_H
18#define DISK_RING_BUFFER_H
20#include <a_util/memory.h>
40template <
typename ADDITIONAL_DATA = u
int8_t, u
int8_t alignment = 1, u
int8_t alignment_fill = 0x00>
93 a_util::memory::MemoryBuffer _alignment_buffer;
108 _start_offset(start_offset),
112 _callback(drop_callback)
115 _current_pos = start_offset;
118 __pragma(warning(push))
119 __pragma(warning(disable:4127))
123 _alignment_buffer.allocate(alignment - 1);
124 std::memset(_alignment_buffer.getPtr(), alignment_fill, _alignment_buffer.getSize());
127 __pragma(warning(pop))
138 return _current_size;
148 throw std::runtime_error(
"history already started wrapping around");
151 _max_size = _current_size;
165 throw std::runtime_error(
"already appending");
170 _current_pos = _file->getFilePos();
171 _bookkeeping =
false;
173 if (_rear_item.file_pos == -1 && !_items.empty())
176 _rear_item = _items.back();
181 *rear_data_item = _rear_item;
188 *last_data_item = _items.back();
192 *last_data_item =
Item();
205 const ADDITIONAL_DATA& additional,
FilePos* file_pos =
nullptr)
209 item.dataSize = data_size;
221 const ADDITIONAL_DATA& additional,
FilePos* file_pos =
nullptr)
223 size_t data_size = 0;
224 for (
size_t piece = 0; piece < count; ++piece)
229 if (_max_size && !_items.empty())
231 if (_current_pos +
static_cast<FileSize>(data_size) > _max_size)
234 _file->truncate(_current_pos);
235 _current_size = _current_pos;
237 _rear_item = _items.back();
240 while (_items.front().file_pos >= _current_pos)
245 _current_pos = _items.front().file_pos;
252 *file_pos = _current_pos;
255 FilePos write_pos = _current_pos;
257 for (
size_t piece = 0; piece < count; ++piece)
259 _file->writeAll(pieces[piece].data,
static_cast<int>(pieces[piece].data_size));
262 _current_pos += data_size;
266 if (_current_pos > _current_size)
268 _current_size = _current_pos;
275 item.
size = data_size;
278 _items.push_back(item);
283 while (_items.size() > 1 &&
284 _items.front().file_pos >= start &&
285 _items.front().file_pos <
end)
290 if (_rear_item.file_pos != -1)
294 if (_rear_item.file_pos <
end)
299 _rear_item = _items.back();
301 _file->truncate(_current_pos);
302 _current_size = _current_pos;
314 return _items.begin();
333 FilePos mod = _current_pos % alignment;
336 FilePos fill = alignment - mod;
337 _file->writeAll(_alignment_buffer.getPtr(),
338 static_cast<size_t>(fill));
339 _current_pos += fill;
352 Item& item = _items.front();
354 if (_items.size() > 1)
358 _callback->onDrop(item, *next);
Definition fileringbuffer.h:59
virtual void onDrop(const Item &dropped_item, const Item &next_item)=0
Items::const_iterator const_iterator
An const iterator in the buffer.
Definition fileringbuffer.h:82
void startWrappingAround()
Definition fileringbuffer.h:144
std::deque< Item > Items
Typedef for convienient access.
Definition fileringbuffer.h:80
void appendItem(const ItemPiece *pieces, size_t count, const ADDITIONAL_DATA &additional, FilePos *file_pos=nullptr)
Definition fileringbuffer.h:220
void appendItem(const void *data, size_t data_size, const ADDITIONAL_DATA &additional, FilePos *file_pos=nullptr)
Definition fileringbuffer.h:204
FileRingBuffer(File *file, FilePos start_offset=0, FileSize max_size=0, DropCallback *drop_callback=nullptr)
Definition fileringbuffer.h:105
void startAppending(Item *rear_data_item=nullptr, Item *last_data_item=nullptr)
Definition fileringbuffer.h:161
const_iterator end() const
Definition fileringbuffer.h:321
const FileSize & getCurrentSize()
Definition fileringbuffer.h:136
void popFront()
Definition fileringbuffer.h:346
const_iterator begin() const
Definition fileringbuffer.h:312
void fillForAlignment()
Definition fileringbuffer.h:331
@ 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)
int64_t FilePos
Type for a file position.
Definition file.h:37
FilePos FileSize
Type for the file size.
Definition file.h:41
Definition fileringbuffer.h:74
const void * data
The data of the piece.
Definition fileringbuffer.h:75
size_t data_size
The size of the piece.
Definition fileringbuffer.h:76
Definition fileringbuffer.h:48
ADDITIONAL_DATA additional
additional bookkeeping data
Definition fileringbuffer.h:52
size_t size
The size of the items data.
Definition fileringbuffer.h:51
FilePos file_pos
The file position of the items data.
Definition fileringbuffer.h:50