261 using index_type = size_t;
262 using difference_type = ptrdiff_t;
266 using const_reference =
const std::byte &;
270 friend class zero_blob;
273 using value_type = zero_blob::value_type;
274 using difference_type = zero_blob::difference_type;
275 using pointer = zero_blob::pointer;
276 using reference = zero_blob::reference;
278 constexpr const_iterator()
noexcept =
default;
280 constexpr const_reference operator*()
const noexcept {
return s_value; }
282 constexpr const_iterator & operator++()
noexcept { ++_idx;
return *
this; }
283 constexpr const_iterator operator++(
int)
noexcept {
return _idx++; }
284 constexpr const_iterator & operator+=(difference_type diff)
noexcept { _idx += size_t(diff);
return *
this; }
286 constexpr const_iterator & operator--()
noexcept { --_idx;
return *
this; }
287 constexpr const_iterator operator--(
int)
noexcept {
return _idx--; }
288 constexpr const_iterator & operator-=(difference_type diff)
noexcept { _idx -= size_t(diff);
return *
this; }
290 friend constexpr difference_type operator-(const_iterator lhs, const_iterator rhs)
noexcept {
return difference_type(lhs._idx - rhs._idx); }
292 friend constexpr bool operator==(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx == rhs._idx; };
293 friend constexpr bool operator!=(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx != rhs._idx; };
294 friend constexpr bool operator<(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx < rhs._idx; };
295 friend constexpr bool operator<=(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx <= rhs._idx; };
296 friend constexpr bool operator>(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx > rhs._idx; };
297 friend constexpr bool operator>=(const_iterator lhs, const_iterator rhs)
noexcept {
return lhs._idx >= rhs._idx; };
299 constexpr const_iterator(
size_t idx) noexcept : _idx(idx) {};
301 size_t _idx = size_t(-1);
304 using iterator = const_iterator;
309 constexpr zero_blob(
size_t size = 0) noexcept : _size{size} {}
311 constexpr zero_blob (
const zero_blob&)
noexcept =
default;
312 constexpr zero_blob& operator=(
const zero_blob&)
noexcept =
default;
314 constexpr zero_blob first(index_type count)
const noexcept
316 assert(count <= size());
320 constexpr zero_blob last (index_type count)
const noexcept
322 assert(count <= size());
327 subspan(index_type offset, index_type count =
size_t(-1))
const noexcept
329 assert(offset <= size());
330 assert(count <= size() || count ==
size_t(-1));
331 if (count ==
size_t(-1))
332 return {size() - offset};
333 assert(offset <= size() - count);
337 constexpr index_type size()
const noexcept {
return _size; }
338 constexpr index_type size_bytes()
const noexcept {
return _size *
sizeof(element_type); }
339 constexpr bool empty()
const noexcept {
return _size == 0; }
341 constexpr reference operator[](index_type idx)
const noexcept
343 assert(idx < size());
348 constexpr reference front()
const noexcept
354 constexpr reference back()
const noexcept
360 constexpr iterator begin()
const noexcept {
return iterator(0); }
361 constexpr iterator end()
const noexcept {
return iterator(size()); }
362 constexpr const_iterator cbegin()
const noexcept {
return const_iterator(0); }
363 constexpr const_iterator cend()
const noexcept {
return const_iterator(size()); }
364 constexpr reverse_iterator rbegin()
const noexcept {
return reverse_iterator(end()); }
365 constexpr reverse_iterator rend()
const noexcept {
return reverse_iterator(begin()); }
366 constexpr const_reverse_iterator crbegin()
const noexcept {
return const_reverse_iterator(cend()); }
367 constexpr const_reverse_iterator crend()
const noexcept {
return const_reverse_iterator(cbegin()); }
371 static inline const std::byte s_value{0};