NEURON
enumerate.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <algorithm>
4 #include <functional>
5 #include <tuple>
6 
7 template <typename T,
8  typename F,
9  typename value_type = typename T::value_type,
10  typename TIter = decltype(std::begin(std::declval<T>())),
11  typename = decltype(std::end(std::declval<T>()))>
12 void apply_to_first(T&& iterable, value_type&& value, F&& f) {
13  auto it = std::find(std::begin(std::forward<T>(iterable)),
14  std::end(std::forward<T>(iterable)),
15  std::forward<value_type>(value));
16  if (it != std::end(std::forward<T>(iterable))) {
17  f(it);
18  }
19 }
20 
21 template <typename T, typename value_type = typename T::value_type>
22 void erase_first(T&& iterable, value_type&& value) {
23  apply_to_first(std::forward<T>(iterable),
24  std::forward<value_type>(value),
25  [&iterable](const auto& it) { iterable.erase(it); });
26 }
27 
28 template <typename T,
29  typename TIter = decltype(std::begin(std::declval<T>())),
30  typename = decltype(std::begin(std::declval<T>())),
31  typename = decltype(std::end(std::declval<T>()))>
32 constexpr auto range(T&& iterable) {
33  struct iterator {
34  std::size_t i;
35  TIter iter;
36  bool operator!=(const iterator& other) const {
37  return iter != other.iter;
38  }
39  void operator++() {
40  ++i;
41  ++iter;
42  }
43  auto operator*() const {
44  return i;
45  }
46  };
47  struct iterable_wrapper {
48  T iterable;
49  auto begin() {
50  return iterator{0, std::begin(iterable)};
51  }
52  auto end() {
53  return iterator{0, std::end(iterable)};
54  }
55  };
56  return iterable_wrapper{std::forward<T>(iterable)};
57 }
58 
59 template <typename T,
60  typename TIter = decltype(std::rbegin(std::declval<T>())),
61  typename = decltype(std::rend(std::declval<T>()))>
62 constexpr auto reverse(T&& iterable) {
63  struct iterator {
64  TIter iter;
65  bool operator!=(const iterator& other) const {
66  return iter != other.iter;
67  }
68  void operator++() {
69  ++iter;
70  }
71  auto&& operator*() const {
72  return *iter;
73  }
74  };
75  struct iterable_wrapper {
76  T iterable;
77  auto begin() {
78  return iterator{std::rbegin(iterable)};
79  }
80  auto end() {
81  return iterator{std::rend(iterable)};
82  }
83  };
84  return iterable_wrapper{std::forward<T>(iterable)};
85 }
86 
87 template <typename T,
88  typename TIter = decltype(std::begin(std::declval<T>())),
89  typename = decltype(std::end(std::declval<T>()))>
90 constexpr auto enumerate(T&& iterable) {
91  struct iterator {
92  std::size_t i;
93  TIter iter;
94  bool operator!=(const iterator& other) const {
95  return iter != other.iter;
96  }
97  void operator++() {
98  ++i;
99  ++iter;
100  }
101  auto operator*() const {
102  return std::forward_as_tuple(i, *iter);
103  }
104  };
105  struct iterable_wrapper {
106  T iterable;
107  auto begin() {
108  return iterator{0, std::begin(iterable)};
109  }
110  auto end() {
111  return iterator{0, std::end(iterable)};
112  }
113  };
114  return iterable_wrapper{std::forward<T>(iterable)};
115 }
116 
117 template <typename T,
118  typename TIter = decltype(std::rbegin(std::declval<T>())),
119  typename = decltype(std::rend(std::declval<T>()))>
120 constexpr auto renumerate(T&& iterable) {
121  struct iterator {
122  std::size_t i;
123  TIter iter;
124  bool operator!=(const iterator& other) const {
125  return iter != other.iter;
126  }
127  void operator++() {
128  --i;
129  ++iter;
130  }
131  auto operator*() const {
132  return std::forward_as_tuple(i, *iter);
133  }
134  };
135  struct iterable_wrapper {
136  T iterable;
137  auto begin() {
138  return iterator{std::size(iterable) - 1, std::rbegin(iterable)};
139  }
140  auto end() {
141  return iterator{std::size(iterable) - 1, std::rend(iterable)};
142  }
143  };
144  return iterable_wrapper{std::forward<T>(iterable)};
145 }
#define i
Definition: md1redef.h:19
void apply_to_first(T &&iterable, value_type &&value, F &&f)
Definition: enumerate.h:12
void erase_first(T &&iterable, value_type &&value)
Definition: enumerate.h:22
constexpr auto reverse(T &&iterable)
Definition: enumerate.h:62
constexpr auto range(T &&iterable)
Definition: enumerate.h:32
constexpr auto renumerate(T &&iterable)
Definition: enumerate.h:120
constexpr auto enumerate(T &&iterable)
Definition: enumerate.h:90
bool operator!=(unified_allocator< T > const &x, unified_allocator< U > const &y) noexcept
Definition: memory.h:76
int find(const int, const int, const int, const int, const int)
static uint32_t value
Definition: scoprand.cpp:25