Tatooine
linspace.h
Go to the documentation of this file.
1#ifndef TATOOINE_LINSPACE_H
2#define TATOOINE_LINSPACE_H
3//============================================================================
4#include <tatooine/concepts.h>
8
9#include <cstddef>
10#include <functional>
11#include <ostream>
12//============================================================================
14//============================================================================
15template <floating_point Real>
16struct iterator;
17//==============================================================================
18template <floating_point Real>
20//============================================================================
21} // namespace tatooine::detail::linspace
22//============================================================================
23namespace tatooine {
24//============================================================================
25template <floating_point Real>
26struct linspace {
27 //============================================================================
28 // typedefs
29 //============================================================================
31 using real_type = Real;
34
35 //============================================================================
36 // members
37 //============================================================================
38 private:
39 Real m_min, m_max;
40 std::size_t m_size;
41
42 //============================================================================
43 // ctors
44 //============================================================================
45 public:
46 constexpr linspace() noexcept : m_min{Real(0)}, m_max{Real(0)}, m_size{0} {}
47 //----------------------------------------------------------------------------
48 constexpr linspace(arithmetic auto const min, arithmetic auto const max,
49 std::size_t const size) noexcept
50 : m_min{std::min(static_cast<Real>(min), static_cast<Real>(max))},
51 m_max{std::max(static_cast<Real>(min), static_cast<Real>(max))},
52 m_size{size} {}
53 //----------------------------------------------------------------------------
54 constexpr linspace(linspace const&) = default;
55 constexpr linspace(linspace&&) noexcept = default;
56 //----------------------------------------------------------------------------
57 template <floating_point OtherReal>
58 explicit constexpr linspace(linspace<OtherReal> const& other) noexcept
59 : m_min{static_cast<Real>(other.front())},
60 m_max{static_cast<Real>(other.back())},
61 m_size{other.size()} {}
62 //----------------------------------------------------------------------------
63 constexpr auto operator=(linspace const&) -> linspace& = default;
64 constexpr auto operator=(linspace&&) noexcept -> linspace& = default;
65 //----------------------------------------------------------------------------
66 template <floating_point OtherReal>
67 constexpr auto operator=(linspace<OtherReal> const& other) noexcept -> auto& {
68 m_min = other.front();
69 m_max = other.back();
70 m_size = other.size();
71 return *this;
72 }
73 //----------------------------------------------------------------------------
74 ~linspace() = default;
75
76 //============================================================================
77 // methods
78 //============================================================================
79 constexpr auto at(std::size_t i) const -> Real {
80 if (m_size <= 1) {
81 return m_min;
82 }
83 return m_min + spacing() * static_cast<Real>(i);
84 }
85 //----------------------------------------------------------------------------
86 constexpr auto operator[](std::size_t const i) const { return at(i); }
87 //----------------------------------------------------------------------------
88 constexpr auto begin() const { return iterator{this, 0}; }
89 constexpr auto end() const { return typename iterator::sentinel_type{this}; }
90 //----------------------------------------------------------------------------
91 constexpr auto size() const { return m_size; }
92 constexpr auto size() -> auto& { return m_size; }
93 constexpr auto front() const { return m_min; }
94 constexpr auto front() -> auto& { return m_min; }
95 constexpr auto back() const { return m_max; }
96 constexpr auto back() -> auto& { return m_max; }
97 //----------------------------------------------------------------------------
98 constexpr auto spacing() const {
99 return (m_max - m_min) / static_cast<Real>(m_size - 1);
100 }
101 //----------------------------------------------------------------------------
102 constexpr auto push_back() {
103 m_max += spacing();
104 ++m_size;
105 }
106 //----------------------------------------------------------------------------
107 constexpr auto pop_back() {
108 m_max -= spacing();
109 --m_size;
110 }
111 //----------------------------------------------------------------------------
112 constexpr auto push_front() {
113 m_min -= spacing();
114 ++m_size;
115 }
116 //----------------------------------------------------------------------------
117 constexpr auto pop_front() {
118 m_min += spacing();
119 --m_size;
120 }
121 //----------------------------------------------------------------------------
122 constexpr auto resize(std::size_t const s) { m_size = s; }
123};
124//------------------------------------------------------------------------------
125template <floating_point Real>
126auto front(linspace<Real> const& l) {
127 return l.front();
128}
129//------------------------------------------------------------------------------
130template <floating_point Real>
131auto front(linspace<Real>& l) -> auto& {
132 return l.front();
133}
134//------------------------------------------------------------------------------
135template <floating_point Real>
136auto back(linspace<Real> const& l) {
137 return l.back();
138}
139//------------------------------------------------------------------------------
140template <floating_point Real>
141auto back(linspace<Real>& l) -> auto& {
142 return l.back();
143}
144//==============================================================================
145// deduction guides
146//==============================================================================
147template <arithmetic Real0, arithmetic Real1>
148linspace(Real0 const, Real1 const, std::size_t const)
150//==============================================================================
151// type traits
152//==============================================================================
153template <typename T>
154struct is_linspace_impl : std::false_type {};
155// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
156template <typename Real>
157struct is_linspace_impl<linspace<Real>> : std::true_type {};
158// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159template <typename T>
161//==============================================================================
162// I/O
163//==============================================================================
164template <floating_point Real>
165auto operator<<(std::ostream& out, linspace<Real> const& l) -> auto& {
166 out << "[" << l[0] << ", " << l[1] << ", ..., " << l.back() << "]";
167 return out;
168}
169//==============================================================================
170} // namespace tatooine
171//==============================================================================
173//==============================================================================
174//template <typename T>
175//TATOOINE_MAKE_TEMPLATED_ADT_REFLECTABLE(
176// linspace<T>, TATOOINE_REFLECTION_INSERT_METHOD(front, front()),
177// TATOOINE_REFLECTION_INSERT_METHOD(back, back()),
178// TATOOINE_REFLECTION_INSERT_METHOD(size, size()))
179//==============================================================================
180} // namespace tatooine::reflection
181//==============================================================================
183//==============================================================================
184template <floating_point Real>
187};
188//==============================================================================
189template <floating_point Real>
190struct iterator : iterator_facade<iterator<Real>> {
193 //============================================================================
194 // typedefs
195 //============================================================================
197
198 //============================================================================
199 // members
200 //============================================================================
201 private:
202 linspace_type const* m_lin = nullptr;
203 std::size_t m_i{};
204
205 //============================================================================
206 // ctors
207 //============================================================================
208 public:
209 constexpr iterator() = default;
210 //----------------------------------------------------------------------------
211 constexpr iterator(linspace_type const* const _lin, std::size_t _i)
212 : m_lin{_lin}, m_i{_i} {}
213 //----------------------------------------------------------------------------
214 constexpr iterator(iterator const&) = default;
215 constexpr iterator(iterator&&) noexcept = default;
216 //============================================================================
217 // assign operators
218 //============================================================================
219 constexpr auto operator=(iterator const& other) -> iterator& = default;
220 constexpr auto operator=(iterator&& other) noexcept -> iterator& = default;
221 //----------------------------------------------------------------------------
222 ~iterator() = default;
223 //============================================================================
224 // iterator_facade implementation
225 //============================================================================
226 constexpr auto equal(iterator const& other) const { return m_i == other.m_i; }
227 constexpr auto dereference() const { return m_lin->at(m_i); }
228 constexpr auto increment(std::size_t inc = 1) { m_i += inc; }
229 constexpr auto decrement(std::size_t dec = 1) { m_i -= dec; }
230 constexpr auto at_end() const { return m_i == m_lin->size(); }
231 constexpr auto distance_to(iterator const& other) const -> std::ptrdiff_t {
232 return other.m_i - m_i;
233 }
234 constexpr auto distance_to(sentinel_type const /*sentinel*/) const
235 -> std::ptrdiff_t {
236 return m_lin->size() - m_i;
237 }
238 constexpr auto advance(std::ptrdiff_t const off) { m_i += off; }
239};
240//==============================================================================
241template <floating_point Real>
243 return iterator{sent.m_lin, sent.m_lin->size() - 1};
244}
245//==============================================================================
246} // namespace tatooine::detail::linspace
247//============================================================================
248#endif
C++20 implementation of an iterator facade.
Definition: iterator_facade.h:154
Definition: concepts.h:33
Definition: concepts.h:30
Definition: linspace.h:13
auto prev(iterator_sentinel< Real >const &sent)
Definition: linspace.h:242
Definition: linspace.h:172
Definition: algorithm.h:6
auto operator<<(std::ostream &out, linspace< Real > const &l) -> auto &
Definition: linspace.h:165
static constexpr auto is_linspace
Definition: linspace.h:160
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
constexpr auto min(A &&a, B &&b)
Definition: math.h:15
auto back(linspace< Real > const &l)
Definition: linspace.h:136
auto front(linspace< Real > const &l)
Definition: linspace.h:126
tatooine::linspace< Real > const * m_lin
Definition: linspace.h:186
Definition: linspace.h:190
constexpr auto increment(std::size_t inc=1)
Definition: linspace.h:228
constexpr iterator(iterator const &)=default
constexpr auto dereference() const
Definition: linspace.h:227
linspace_type const * m_lin
Definition: linspace.h:202
constexpr iterator(linspace_type const *const _lin, std::size_t _i)
Definition: linspace.h:211
constexpr auto distance_to(iterator const &other) const -> std::ptrdiff_t
Definition: linspace.h:231
constexpr auto at_end() const
Definition: linspace.h:230
constexpr auto equal(iterator const &other) const
Definition: linspace.h:226
constexpr auto advance(std::ptrdiff_t const off)
Definition: linspace.h:238
constexpr iterator(iterator &&) noexcept=default
constexpr auto distance_to(sentinel_type const) const -> std::ptrdiff_t
Definition: linspace.h:234
std::size_t m_i
Definition: linspace.h:203
constexpr auto decrement(std::size_t dec=1)
Definition: linspace.h:229
Definition: linspace.h:154
Definition: linspace.h:26
real_type value_type
Definition: linspace.h:32
constexpr linspace(linspace &&) noexcept=default
constexpr linspace(linspace const &)=default
Real real_type
Definition: linspace.h:31
constexpr auto front() -> auto &
Definition: linspace.h:94
constexpr auto operator[](std::size_t const i) const
Definition: linspace.h:86
constexpr auto end() const
Definition: linspace.h:89
constexpr auto at(std::size_t i) const -> Real
Definition: linspace.h:79
constexpr linspace() noexcept
Definition: linspace.h:46
constexpr auto spacing() const
Definition: linspace.h:98
Real m_max
Definition: linspace.h:39
Real m_min
Definition: linspace.h:39
constexpr auto operator=(linspace const &) -> linspace &=default
constexpr linspace(arithmetic auto const min, arithmetic auto const max, std::size_t const size) noexcept
Definition: linspace.h:48
constexpr auto push_back()
Definition: linspace.h:102
constexpr auto back() const
Definition: linspace.h:95
constexpr auto size() -> auto &
Definition: linspace.h:92
constexpr auto pop_front()
Definition: linspace.h:117
constexpr auto resize(std::size_t const s)
Definition: linspace.h:122
constexpr auto operator=(linspace &&) noexcept -> linspace &=default
constexpr auto size() const
Definition: linspace.h:91
std::size_t m_size
Definition: linspace.h:40
constexpr auto pop_back()
Definition: linspace.h:107
constexpr auto begin() const
Definition: linspace.h:88
constexpr auto front() const
Definition: linspace.h:93
constexpr auto back() -> auto &
Definition: linspace.h:96
constexpr auto push_front()
Definition: linspace.h:112