di 0.1.0
Loading...
Searching...
No Matches
span_dynamic_size.h
Go to the documentation of this file.
1#pragma once
2
15#include "di/meta/core.h"
16#include "di/meta/language.h"
17#include "di/meta/operations.h"
18#include "di/meta/trivial.h"
19#include "di/meta/vocab.h"
20#include "di/types/size_t.h"
21#include "di/util/to_address.h"
22#include "di/util/to_owned.h"
25
26namespace di::vocab {
27template<typename T>
29 : public meta::EnableView<Span<T, dynamic_extent>>
30 , public meta::EnableBorrowedContainer<Span<T, dynamic_extent>>
31 , public container::ConstantVectorInterface<Span<T, dynamic_extent>, T> {
32public:
33 using Value = T;
34 using ConstValue = T;
35
36 constexpr Span() = default;
37
38 template<concepts::ContiguousIterator Iter>
40 constexpr Span(Iter iterator, types::size_t size) : m_data(util::to_address(iterator)), m_size(size) {}
41
42 template<concepts::ContiguousIterator Iter, concepts::SizedSentinelFor<Iter> Sent>
45 constexpr Span(Iter iterator, Sent sentinel) : m_data(util::to_address(iterator)), m_size(sentinel - iterator) {}
46
47 template<types::size_t size>
48 constexpr Span(T (&array)[size]) : m_data(array), m_size(size) {}
49
50 template<concepts::QualificationConvertibleTo<T> U, types::size_t size>
51 constexpr Span(vocab::Array<U, size>& array) : m_data(array.data()), m_size(size) {}
52
53 template<typename U, types::size_t size>
55 constexpr Span(vocab::Array<U, size> const& array) : m_data(array.data()), m_size(size) {}
56
57 template<concepts::ContiguousContainer Con>
61 constexpr explicit Span(Con&& container) : m_data(container::data(container)), m_size(container::size(container)) {}
62
63 template<concepts::QualificationConvertibleTo<T> U, types::size_t other_extent>
64 constexpr Span(Span<U, other_extent> const& other) : m_data(other.data()), m_size(other.size()) {}
65
66 constexpr Span(Span const&) = default;
67
68 constexpr auto operator=(Span const&) -> Span& = default;
69
70 constexpr auto data() const -> T* { return m_data; }
71 constexpr auto size() const -> types::size_t { return m_size; }
72
73 constexpr auto span() const -> Span { return *this; }
74
75 template<concepts::ImplicitLifetime U>
77 auto typed_pointer(size_t byte_offset) const -> Optional<U*> {
78 if (byte_offset + sizeof(U) > size()) {
79 return nullopt;
80 }
81 return reinterpret_cast<U*>(m_data + byte_offset);
82 }
83
84 template<concepts::ImplicitLifetime U>
86 auto typed_pointer(size_t byte_offset) const -> Optional<U const*> {
87 if (byte_offset + sizeof(U) > size()) {
88 return nullopt;
89 }
90 return reinterpret_cast<U const*>(m_data + byte_offset);
91 }
92
93 template<concepts::ImplicitLifetime U>
95 auto typed_pointer_unchecked(size_t byte_offset) const -> U* {
96 return reinterpret_cast<U*>(m_data + byte_offset);
97 }
98
99 template<concepts::ImplicitLifetime U>
101 auto typed_pointer_unchecked(size_t byte_offset) const -> U const* {
102 return reinterpret_cast<U const*>(m_data + byte_offset);
103 }
104
105 template<concepts::ImplicitLifetime U>
107 auto typed_span(size_t byte_offset, size_t count) const -> Optional<Span<U>> {
108 if (byte_offset + sizeof(U) * count > size()) {
109 return nullopt;
110 }
111 return Span<U> { typed_pointer_unchecked<U>(byte_offset), count };
112 }
113
114 template<concepts::ImplicitLifetime U>
116 auto typed_span(size_t byte_offset, size_t count) const -> Optional<Span<U const>> {
117 if (byte_offset + sizeof(U) * count > size()) {
118 return nullopt;
119 }
121 }
122
123 template<concepts::ImplicitLifetime U>
125 auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span<U> {
126 return Span<U> { typed_pointer_unchecked<U>(byte_offset), count };
127 }
128
129 template<concepts::ImplicitLifetime U>
131 auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span<U const> {
133 }
134
135private:
136 T* m_data { nullptr };
137 types::size_t m_size { 0 };
138};
139
140template<typename Iter, typename SentOrSize>
142
143template<typename Con>
145}
Definition constant_vector_interface.h:28
constexpr auto iterator(size_t index)
Definition constant_vector_interface.h:56
Definition enable_borrowed_container.h:7
Definition enable_view.h:7
Definition optional_forward_declaration.h:5
constexpr auto span() const -> Span
Definition span_dynamic_size.h:73
constexpr Span(Iter iterator, types::size_t size)
Definition span_dynamic_size.h:40
constexpr auto data() const -> T *
Definition span_dynamic_size.h:70
auto typed_pointer(size_t byte_offset) const -> Optional< U const * >
Definition span_dynamic_size.h:86
constexpr Span(vocab::Array< U, size > &array)
Definition span_dynamic_size.h:51
auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span< U >
Definition span_dynamic_size.h:125
constexpr auto operator=(Span const &) -> Span &=default
constexpr Span(Span const &)=default
constexpr Span(Iter iterator, Sent sentinel)
Definition span_dynamic_size.h:45
constexpr Span(Con &&container)
Definition span_dynamic_size.h:61
T Value
Definition span_dynamic_size.h:33
constexpr Span(Span< U, other_extent > const &other)
Definition span_dynamic_size.h:64
auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span< U const >
Definition span_dynamic_size.h:131
auto typed_pointer_unchecked(size_t byte_offset) const -> U *
Definition span_dynamic_size.h:95
constexpr Span(T(&array)[size])
Definition span_dynamic_size.h:48
T ConstValue
Definition span_dynamic_size.h:34
constexpr auto size() const -> types::size_t
Definition span_dynamic_size.h:71
auto typed_pointer(size_t byte_offset) const -> Optional< U * >
Definition span_dynamic_size.h:77
auto typed_span(size_t byte_offset, size_t count) const -> Optional< Span< U const > >
Definition span_dynamic_size.h:116
constexpr Span(vocab::Array< U, size > const &array)
Definition span_dynamic_size.h:55
auto typed_span(size_t byte_offset, size_t count) const -> Optional< Span< U > >
Definition span_dynamic_size.h:107
auto typed_pointer_unchecked(size_t byte_offset) const -> U const *
Definition span_dynamic_size.h:101
Definition span_forward_declaration.h:10
Definition vocab.h:27
Definition borrowed_container.h:8
Definition language.h:18
Definition operations.h:99
Definition language.h:110
Definition core.h:114
Definition sized_container.h:8
Definition vocab.h:146
Definition sequence.h:12
Definition method.h:5
std::size_t size_t
Definition size_t.h:12
constexpr auto to_address
Definition to_address.h:22
Definition lazy.h:165
Span(Iter, SentOrSize) -> Span< meta::RemoveReference< meta::IteratorReference< Iter > > >
constexpr auto nullopt
Definition nullopt.h:15
constexpr auto dynamic_extent
Definition span_forward_declaration.h:7
constexpr auto size
Definition size.h:62
constexpr auto count
Definition count.h:37
Definition array.h:27