Tatooine
algorithm.h
Go to the documentation of this file.
1#ifndef TATOOINE_ALGORITHM_H
2#define TATOOINE_ALGORITHM_H
3//==============================================================================
4#include <cstddef>
5//==============================================================================
6namespace tatooine {
7//==============================================================================
8template <typename Range, typename RangeIt>
9decltype(auto) resize_prev_list(Range& range, RangeIt pos,
10 std::size_t new_prev_size) {
11 auto prev_size = distance(begin(range), pos);
12 auto size_change =
13 static_cast<int>(new_prev_size) - static_cast<int>(prev_size);
14 if (size_change > 0) {
15 for (std::size_t i = 0; i < static_cast<std::size_t>(size_change); ++i) {
16 range.emplace_front(range.front());
17 }
18 } else if (size_change < 0) {
19 range.erase(begin(range), next(begin(range), prev_size - new_prev_size));
20 }
21 return range;
22}
23//------------------------------------------------------------------------------
24template <typename Range, typename RangeIt>
25decltype(auto) resize_next_list(Range& range, RangeIt pos,
26 std::size_t new_next_size) {
27 auto next_size = distance(next(pos), end(range));
28 int size_change =
29 static_cast<int>(new_next_size) - static_cast<int>(next_size);
30 if (size_change > 0) {
31 for (std::size_t i = 0; i < static_cast<std::size_t>(size_change); ++i) {
32 range.emplace_back(range.back());
33 }
34 } else if (size_change < 0) {
35 range.erase(prev(end(range), next_size - new_next_size), end(range));
36 }
37}
38//------------------------------------------------------------------------------
39template <typename T>
40constexpr auto clamp(const T& v, const T& lo, const T& hi) -> const T& {
41 assert(!(hi < lo));
42 return (v < lo) ? lo : (hi < v) ? hi : v;
43}
44//------------------------------------------------------------------------------
45template <typename T, typename Compare>
46constexpr auto clamp(const T& v, const T& lo, const T& hi, Compare comp)
47 -> const T& {
48 assert(!comp(hi, lo));
49 return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
50}
51//==============================================================================
52} // namespace tatooine
53//==============================================================================
54
55#endif
Definition: concepts.h:84
Definition: algorithm.h:6
constexpr auto distance(Iter const &it0, Iter const &it1)
Definition: iterator_facade.h:372
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
auto next(Iter iter)
Definition: iterator_facade.h:325
decltype(auto) resize_next_list(Range &range, RangeIt pos, std::size_t new_next_size)
Definition: algorithm.h:25
constexpr auto clamp(const T &v, const T &lo, const T &hi) -> const T &
Definition: algorithm.h:40
decltype(auto) resize_prev_list(Range &range, RangeIt pos, std::size_t new_prev_size)
Definition: algorithm.h:9
auto prev(Iter iter)
Definition: iterator_facade.h:343