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>()))>
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))) {
21 template <
typename T,
typename value_type =
typename T::value_type>
24 std::forward<value_type>(
value),
25 [&iterable](
const auto& it) { iterable.erase(it); });
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) {
37 return iter != other.iter;
43 auto operator*()
const {
47 struct iterable_wrapper {
50 return iterator{0, std::begin(iterable)};
53 return iterator{0, std::end(iterable)};
56 return iterable_wrapper{std::forward<T>(iterable)};
60 typename TIter = decltype(std::rbegin(std::declval<T>())),
61 typename = decltype(std::rend(std::declval<T>()))>
66 return iter != other.iter;
71 auto&& operator*()
const {
75 struct iterable_wrapper {
78 return iterator{std::rbegin(iterable)};
81 return iterator{std::rend(iterable)};
84 return iterable_wrapper{std::forward<T>(iterable)};
88 typename TIter = decltype(std::begin(std::declval<T>())),
89 typename = decltype(std::end(std::declval<T>()))>
95 return iter != other.iter;
101 auto operator*()
const {
102 return std::forward_as_tuple(
i, *iter);
105 struct iterable_wrapper {
108 return iterator{0, std::begin(iterable)};
111 return iterator{0, std::end(iterable)};
114 return iterable_wrapper{std::forward<T>(iterable)};
117 template <
typename T,
118 typename TIter = decltype(std::rbegin(std::declval<T>())),
119 typename = decltype(std::rend(std::declval<T>()))>
124 bool operator!=(
const iterator& other)
const {
125 return iter != other.iter;
131 auto operator*()
const {
132 return std::forward_as_tuple(
i, *iter);
135 struct iterable_wrapper {
138 return iterator{std::size(iterable) - 1, std::rbegin(iterable)};
141 return iterator{std::size(iterable) - 1, std::rend(iterable)};
144 return iterable_wrapper{std::forward<T>(iterable)};
void apply_to_first(T &&iterable, value_type &&value, F &&f)
void erase_first(T &&iterable, value_type &&value)
constexpr auto reverse(T &&iterable)
constexpr auto range(T &&iterable)
constexpr auto renumerate(T &&iterable)
constexpr auto enumerate(T &&iterable)
bool operator!=(unified_allocator< T > const &x, unified_allocator< U > const &y) noexcept
int find(const int, const int, const int, const int, const int)