Iros
 
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"
24
25namespace di::vocab {
26template<typename T>
28 : public meta::EnableView<Span<T, dynamic_extent>>
29 , public meta::EnableBorrowedContainer<Span<T, dynamic_extent>>
30 , public container::ConstantVectorInterface<Span<T, dynamic_extent>, T> {
31public:
32 using Value = T;
33 using ConstValue = T;
34
35 constexpr Span() = default;
36
37 template<concepts::ContiguousIterator Iter>
39 constexpr Span(Iter iterator, types::size_t size) : m_data(util::to_address(iterator)), m_size(size) {}
40
41 template<concepts::ContiguousIterator Iter, concepts::SizedSentinelFor<Iter> Sent>
44 constexpr Span(Iter iterator, Sent sentinel) : m_data(util::to_address(iterator)), m_size(sentinel - iterator) {}
45
46 template<types::size_t size>
47 constexpr Span(T (&array)[size]) : m_data(array), m_size(size) {}
48
49 template<concepts::QualificationConvertibleTo<T> U, types::size_t size>
50 constexpr Span(vocab::Array<U, size>& array) : m_data(array.data()), m_size(size) {}
51
52 template<typename U, types::size_t size>
54 constexpr Span(vocab::Array<U, size> const& array) : m_data(array.data()), m_size(size) {}
55
56 template<concepts::ContiguousContainer Con>
60 constexpr explicit Span(Con&& container) : m_data(container::data(container)), m_size(container::size(container)) {}
61
62 template<concepts::QualificationConvertibleTo<T> U, types::size_t other_extent>
63 constexpr Span(Span<U, other_extent> const& other) : m_data(other.data()), m_size(other.size()) {}
64
65 constexpr Span(Span const&) = default;
66
67 constexpr auto operator=(Span const&) -> Span& = default;
68
69 constexpr auto data() const -> T* { return m_data; }
70 constexpr auto size() const -> types::size_t { return m_size; }
71
72 constexpr auto span() const -> Span { return *this; }
73
74 template<concepts::ImplicitLifetime U>
76 auto typed_pointer(size_t byte_offset) const -> Optional<U*> {
77 if (byte_offset + sizeof(U) > size()) {
78 return nullopt;
79 }
80 return reinterpret_cast<U*>(m_data + byte_offset);
81 }
82
83 template<concepts::ImplicitLifetime U>
85 auto typed_pointer(size_t byte_offset) const -> Optional<U const*> {
86 if (byte_offset + sizeof(U) > size()) {
87 return nullopt;
88 }
89 return reinterpret_cast<U const*>(m_data + byte_offset);
90 }
91
92 template<concepts::ImplicitLifetime U>
94 auto typed_pointer_unchecked(size_t byte_offset) const -> U* {
95 return reinterpret_cast<U*>(m_data + byte_offset);
96 }
97
98 template<concepts::ImplicitLifetime U>
100 auto typed_pointer_unchecked(size_t byte_offset) const -> U const* {
101 return reinterpret_cast<U const*>(m_data + byte_offset);
102 }
103
104 template<concepts::ImplicitLifetime U>
106 auto typed_span(size_t byte_offset, size_t count) const -> Optional<Span<U>> {
107 if (byte_offset + sizeof(U) * count > size()) {
108 return nullopt;
109 }
110 return Span<U> { typed_pointer_unchecked<U>(byte_offset), count };
111 }
112
113 template<concepts::ImplicitLifetime U>
115 auto typed_span(size_t byte_offset, size_t count) const -> Optional<Span<U const>> {
116 if (byte_offset + sizeof(U) * count > size()) {
117 return nullopt;
118 }
120 }
121
122 template<concepts::ImplicitLifetime U>
124 auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span<U> {
125 return Span<U> { typed_pointer_unchecked<U>(byte_offset), count };
126 }
127
128 template<concepts::ImplicitLifetime U>
130 auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span<U const> {
132 }
133
134private:
135 T* m_data { nullptr };
136 types::size_t m_size { 0 };
137};
138
139template<typename Iter, typename SentOrSize>
141
142template<typename Con>
144}
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
Definition span_forward_declaration.h:10
constexpr auto span() const -> Span
Definition span_dynamic_size.h:72
constexpr Span(Iter iterator, types::size_t size)
Definition span_dynamic_size.h:39
constexpr auto data() const -> T *
Definition span_dynamic_size.h:69
auto typed_pointer(size_t byte_offset) const -> Optional< U const * >
Definition span_dynamic_size.h:85
constexpr Span(vocab::Array< U, size > &array)
Definition span_dynamic_size.h:50
auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span< U >
Definition span_dynamic_size.h:124
constexpr auto operator=(Span const &) -> Span &=default
constexpr Span(Span const &)=default
constexpr Span(Iter iterator, Sent sentinel)
Definition span_dynamic_size.h:44
constexpr Span(Con &&container)
Definition span_dynamic_size.h:60
T Value
Definition span_dynamic_size.h:32
constexpr Span(Span< U, other_extent > const &other)
Definition span_dynamic_size.h:63
auto typed_span_unchecked(size_t byte_offset, size_t count) const -> Span< U const >
Definition span_dynamic_size.h:130
auto typed_pointer_unchecked(size_t byte_offset) const -> U *
Definition span_dynamic_size.h:94
constexpr Span(T(&array)[size])
Definition span_dynamic_size.h:47
T ConstValue
Definition span_dynamic_size.h:33
constexpr auto size() const -> types::size_t
Definition span_dynamic_size.h:70
auto typed_pointer(size_t byte_offset) const -> Optional< U * >
Definition span_dynamic_size.h:76
auto typed_span(size_t byte_offset, size_t count) const -> Optional< Span< U const > >
Definition span_dynamic_size.h:115
constexpr Span(vocab::Array< U, size > const &array)
Definition span_dynamic_size.h:54
auto typed_span(size_t byte_offset, size_t count) const -> Optional< Span< U > >
Definition span_dynamic_size.h:106
auto typed_pointer_unchecked(size_t byte_offset) const -> U const *
Definition span_dynamic_size.h:100
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:54
constexpr auto count
Definition count.h:37
Definition span_fixed_size.h:37