11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
14#include <initializer_list>
18PROMEKI_NAMESPACE_BEGIN
92 friend class BufferView;
99 const Buffer &buffer()
const;
113 size_t bufferIndex()
const;
116 size_t offset()
const;
132 const uint8_t *data()
const;
135 bool isValid()
const;
138 bool isNull()
const {
return !isValid(); }
141 const BufferView *_list =
nullptr;
144 Entry(
const BufferView *list,
size_t idx) : _list(list), _idx(idx) {}
154 friend class BufferView;
157 Iterator() =
default;
158 Entry operator*()
const {
return Entry(_list, _idx); }
159 Iterator &operator++() {
163 Iterator operator++(
int) {
168 bool operator==(
const Iterator &o)
const {
return _list == o._list && _idx == o._idx; }
169 bool operator!=(
const Iterator &o)
const {
return !(*
this == o); }
172 const BufferView *_list =
nullptr;
175 Iterator(
const BufferView *list,
size_t idx) : _list(list), _idx(idx) {}
181 BufferView() =
default;
194 BufferView(Buffer buf,
size_t offset,
size_t size);
206 BufferView(std::initializer_list<BufferView> init);
211 size_t count()
const {
return _views.size(); }
214 bool isEmpty()
const {
return _views.isEmpty(); }
217 Entry operator[](
size_t i)
const {
return Entry(
this, i); }
219 Iterator begin()
const {
return Iterator(
this, 0); }
220 Iterator end()
const {
return Iterator(
this, _views.size()); }
232 const Buffer &buffer()
const;
235 size_t offset()
const;
247 const uint8_t *data()
const;
253 bool isValid()
const;
256 bool isNull()
const {
return !isValid(); }
265 void pushToBack(Buffer buf,
size_t offset,
size_t size);
271 void append(
const BufferView &other);
289 size_t totalSize()
const {
return size(); }
302 bool isExclusive()
const;
313 void ensureExclusive();
328 [[nodiscard]] Error seal()
const;
332 size_t bufferIdx = 0;
337 Buffer::List _buffers;
343 size_t internBuffer(
const Buffer &buf);