Iros
 
Loading...
Searching...
No Matches
static_ring.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/types/prelude.h"
13
14namespace di::container {
15template<typename T, typename SizeConstant>
16class StaticRing : public MutableRingInterface<StaticRing<T, SizeConstant>, T> {
17private:
18 constexpr static usize inline_capacity = SizeConstant {};
19
21
22public:
23 using Value = T;
24 using ConstValue = T const;
25
26 constexpr StaticRing() {
27 for (auto& x : m_data) {
28 x = T();
29 }
30 }
31
32 StaticRing(StaticRing const&) = default;
33 StaticRing(StaticRing&&) = default;
34
35 auto operator=(StaticRing const&) -> StaticRing& = default;
36 auto operator=(StaticRing&&) -> StaticRing& = default;
37
38 constexpr auto span() -> Span<T> { return { m_data, m_size }; }
39 constexpr auto span() const -> Span<T const> { return { m_data, m_size }; }
40
41 constexpr auto capacity() const -> usize { return inline_capacity; }
42 constexpr auto max_size() const -> usize { return inline_capacity; }
43
45 DI_ASSERT(this->size() == 0U);
46 if (n > inline_capacity) {
47 return Unexpected(NoCapacityError {});
48 }
49 return {};
50 }
51 constexpr void assume_size(usize size) { m_size = static_cast<SizeType>(size); }
52 constexpr auto grow_capacity(usize min_capacity) const -> usize { return min_capacity; }
53
54 constexpr auto head() const -> usize { return m_head; }
55 constexpr auto tail() const -> usize { return m_tail; }
56
57 constexpr void assume_head(usize head) { m_head = static_cast<SizeType>(head); }
58 constexpr void assume_tail(usize tail) { m_tail = static_cast<SizeType>(tail); }
59
60private:
61 T m_data[inline_capacity];
62 SizeType m_size { 0 };
63 SizeType m_head { 0 };
64 SizeType m_tail { 0 };
65};
66}
67
68namespace di {
70}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition mutable_ring_interface.h:8
Definition static_ring.h:16
T const ConstValue
Definition static_ring.h:24
auto operator=(StaticRing &&) -> StaticRing &=default
constexpr void assume_head(usize head)
Definition static_ring.h:57
constexpr auto tail() const -> usize
Definition static_ring.h:55
StaticRing(StaticRing const &)=default
StaticRing(StaticRing &&)=default
constexpr auto max_size() const -> usize
Definition static_ring.h:42
constexpr void assume_tail(usize tail)
Definition static_ring.h:58
constexpr auto grow_capacity(usize min_capacity) const -> usize
Definition static_ring.h:52
auto operator=(StaticRing const &) -> StaticRing &=default
constexpr auto reserve_from_nothing(usize n) -> Expected< void, NoCapacityError >
Definition static_ring.h:44
constexpr void assume_size(usize size)
Definition static_ring.h:51
constexpr auto span() const -> Span< T const >
Definition static_ring.h:39
constexpr auto head() const -> usize
Definition static_ring.h:54
constexpr auto capacity() const -> usize
Definition static_ring.h:41
constexpr StaticRing()
Definition static_ring.h:26
constexpr auto span() -> Span< T >
Definition static_ring.h:38
T Value
Definition static_ring.h:23
Definition expected_forward_declaration.h:8
Definition span_forward_declaration.h:10
Definition unexpected.h:14
Definition sequence.h:12
constexpr auto size
Definition size.h:54
decltype(detail::smallest_unsigned_type_helper(c_< size >)) SmallestUnsignedType
Definition smallest_unsigned_type.h:27
size_t usize
Definition integers.h:33
Definition zstring_parser.h:9
Definition static_vector.h:14