20namespace sequoia::maths
28 using container_type = C;
29 using compare_type = Compare;
30 using size_type =
typename C::size_type;
32 using const_iterator =
typename C::const_iterator;
33 using const_reverse_iterator =
typename C::const_reverse_iterator;
48 constexpr size_type size()
const noexcept {
return m_Sequence.size(); }
51 constexpr bool empty()
const noexcept {
return m_Sequence.empty(); }
54 constexpr const_iterator begin()
const noexcept {
return m_Sequence.begin(); }
57 constexpr const_iterator end()
const noexcept {
return m_Sequence.end(); }
60 constexpr const_iterator cbegin()
const noexcept {
return m_Sequence.cbegin(); }
63 constexpr const_iterator cend()
const noexcept {
return m_Sequence.cend(); }
66 constexpr const_reverse_iterator rbegin()
const noexcept {
return m_Sequence.rbegin(); }
69 constexpr const_reverse_iterator rend()
const noexcept {
return m_Sequence.rend(); }
72 constexpr const_reverse_iterator crbegin()
const noexcept {
return m_Sequence.crbegin(); }
75 constexpr const_reverse_iterator crend()
const noexcept {
return m_Sequence.crend(); }
78 constexpr const T& operator[](
const size_type i)
const {
return m_Sequence[i]; }
81 constexpr const T& back()
const {
return *(end() - 1); }
84 constexpr const T& front()
const {
return *begin(); }
86 template<
class UnaryOp>
87 constexpr void mutate(const_iterator first, const_iterator last, UnaryOp op)
92 auto f{tmp.begin() + std::ranges::distance(cbegin(), first)};
93 auto l{tmp.begin() + std::ranges::distance(cbegin(), last)};
95 for(
auto i{f}; i != l; ++i)
100 if(f != tmp.begin()) --f;
101 if(l != tmp.end()) ++l;
103 while((f != l) && (f + 1) != tmp.end())
105 if(Compare{}(*f, *(f+1)))
106 throw std::logic_error(
"monotonic_sequence::mutate - monotonicity violated");
111 m_Sequence = std::move(tmp);
115 template<
class UnaryOp>
116 constexpr void mutate(
unsafe_t, const_iterator first, const_iterator last, UnaryOp op)
120 auto pos{m_Sequence.begin() + std::ranges::distance(cbegin(), first++)};
129 template<alloc Allocator>
131 : m_Sequence(allocator)
134 template<alloc Allocator>
136 : m_Sequence{list, allocator}
143 template<alloc Allocator>
145 : m_Sequence{s.m_Sequence, allocator}
148 template<alloc Allocator>
150 : m_Sequence{std::move(s.m_Sequence), allocator}
160 std::ranges::swap(m_Sequence, other.m_Sequence);
163 auto get_allocator()
const
165 return m_Sequence.get_allocator();
170 if(!m_Sequence.empty() && Compare{}(m_Sequence.back(), v))
171 throw std::logic_error{
"monotonic_sequence_base::push_back - monotonicity violated"};
173 m_Sequence.push_back(std::move(v));
176 const_iterator insert(const_iterator pos, T v)
178 if(((pos != cend()) && Compare{}(v, *pos)) || ((pos != cbegin()) && Compare{}(*(pos-1), v)))
180 throw std::logic_error{
"monotonic_sequence_base::insert - monotonicity violated"};
183 return m_Sequence.insert(pos, std::move(v));
186 const_iterator erase(const_iterator pos)
188 return m_Sequence.erase(pos);
191 const_iterator erase(const_iterator first, const_iterator last)
193 return m_Sequence.erase(first, last);
196 void reserve(
const size_type new_cap)
198 m_Sequence.reserve(new_cap);
201 size_type capacity()
const noexcept
203 return m_Sequence.capacity();
208 m_Sequence.shrink_to_fit();
211 void clear()
noexcept
227 : m_Sequence{utilities::to_array<T, static_type::size()>(list)}
232 constexpr void check()
236 for(
auto i{begin()+1}; i != end(); ++i)
238 if(Compare{}(*(i-1), *i))
239 throw std::logic_error(
"monotonic_sequence_base::monotonic_sequence_base - monotonicity violated");
246 template<
class T,
class Compare=std::ranges::less,
class C=std::vector<T>>
251 static_assert(has_allocator_type_v<C>);
253 using allocator_type =
typename C::allocator_type;
261 monotonic_sequence(std::initializer_list<T> list,
const allocator_type& allocator=allocator_type{})
287 allocator_type get_allocator()
const
289 return base_t::get_allocator();
292 using base_t::push_back;
293 using base_t::insert;
295 using base_t::reserve;
296 using base_t::capacity;
297 using base_t::shrink_to_fit;
301 template<
class T, std::
size_t N,
class Compare=std::ranges::less>
A collection of constexpr algorithms.
Utility to convert an initializer_list into an array, potentially transforming the initializer_list i...
Implementation details for monotonic sequences.
Definition: MonotonicSequence.hpp:25
Definition: MonotonicSequence.hpp:248
Definition: MonotonicSequence.hpp:303
Definition: MonotonicSequenceDetails.hpp:18
Definition: MonotonicSequence.hpp:22