Horizon
Loading...
Searching...
No Matches
operations.hpp
Go to the documentation of this file.
1
2// Range v3 library
3//
4// Copyright Eric Niebler 2014-present
5// Copyright Gonzalo Brito Gadeschi 2017
6//
7// Use, modification and distribution is subject to the
8// Boost Software License, Version 1.0. (See accompanying
9// file LICENSE_1_0.txt or copy at
10// http://www.boost.org/LICENSE_1_0.txt)
11//
12// Project home: https://github.com/ericniebler/range-v3
13//
14
15#ifndef RANGES_V3_RANGE_OPERATIONS_HPP
16#define RANGES_V3_RANGE_OPERATIONS_HPP
17
18#include <stdexcept>
19
21
26#include <range/v3/utility/static_const.hpp>
27
28#include <range/v3/detail/prologue.hpp>
29
30namespace ranges
31{
35 struct at_fn
36 {
38 template(typename Rng)(
41 constexpr range_reference_t<Rng> //
42 operator()(Rng && rng, range_difference_t<Rng> n) const
43 {
44 // Workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67371 in GCC 5
45 check_throw(rng, n);
46 return ranges::begin(rng)[n];
47 }
48
49 private:
50 template<typename Rng>
51 static constexpr void check_throw(Rng && rng, range_difference_t<Rng> n)
52 {
53 (n < 0 || n >= ranges::distance(rng)) ? throw std::out_of_range("ranges::at")
54 : void(0);
55 }
56 };
57
62 RANGES_INLINE_VARIABLE(at_fn, at)
63
64
67 struct index_fn
68 {
70 template(typename Rng, typename Int)(
71 requires random_access_range<Rng> AND integral<Int> AND borrowed_range<Rng>)
72 constexpr range_reference_t<Rng> operator()(Rng && rng, Int n) const //
73 {
74 using D = range_difference_t<Rng>;
75 RANGES_EXPECT(0 <= static_cast<D>(n));
76 RANGES_EXPECT(!(bool)sized_range<Rng> ||
77 static_cast<D>(n) < ranges::distance(rng));
78 return ranges::begin(rng)[static_cast<D>(n)];
79 }
80 };
81
86 RANGES_INLINE_VARIABLE(index_fn, index)
87
88
89 struct back_fn
90 {
92 template(typename Rng)(
95 constexpr range_reference_t<Rng> operator()(Rng && rng) const
96 {
97 return *prev(end(rng));
98 }
99 };
100
103 RANGES_INLINE_VARIABLE(back_fn, back)
104
105
106 struct front_fn
107 {
109 template(typename Rng)(
111 constexpr range_reference_t<Rng> operator()(Rng && rng) const
112 {
113 return *begin(rng);
114 }
115 };
116
119 RANGES_INLINE_VARIABLE(front_fn, front)
120} // namespace ranges
121
122#include <range/v3/detail/epilogue.hpp>
123
124#endif
The bidirectional_range concept.
The borrowed_range concept.
The common_range concept.
The forward_range concept.
The random_access_range concept.
The sized_range concept.
Checked indexed range access.
Definition operations.hpp:36
Unchecked indexed range access.
Definition operations.hpp:90
Definition operations.hpp:107
Checked indexed range access.
Definition operations.hpp:68