File Coverage

/usr/local/lib/perl5/site_perl/5.26.1/XS/librangeV3.x/i/range/v3/iterator_range.hpp
Criterion Covered Total %
statement 3 3 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 3 3 100.0


line stmt bran cond sub pod time code
1             /// \file
2             // Range v3 library
3             //
4             // Copyright Eric Niebler 2013-present
5             //
6             // Use, modification and distribution is subject to the
7             // Boost Software License, Version 1.0. (See accompanying
8             // file LICENSE_1_0.txt or copy at
9             // http://www.boost.org/LICENSE_1_0.txt)
10             //
11             // Project home: https://github.com/ericniebler/range-v3
12             //
13              
14             #ifndef RANGES_V3_ITERATOR_RANGE_HPP
15             #define RANGES_V3_ITERATOR_RANGE_HPP
16              
17             #include
18             #include
19             #include
20             #include
21             #include
22             #include
23             #include
24             #include
25             #include
26             #include
27             #include
28             #include
29              
30             namespace ranges
31             {
32             inline namespace v3
33             {
34             /// \addtogroup group-core
35             /// @{
36             template
37             struct RANGES_EMPTY_BASES iterator_range
38             : tagged_compressed_tuple
39             , view_interface>
40             {
41             private:
42             using base_t = tagged_compressed_tuple;
43             public:
44             using iterator = I;
45             using sentinel = S;
46             #ifndef RANGES_DOXYGEN_INVOKED
47             using const_iterator = I; // Mostly to avoid spurious errors in Boost.Range
48             #endif
49              
50             using base_t::begin;
51             using base_t::end;
52              
53             iterator_range() = default;
54 319           constexpr iterator_range(I begin, S end)
55 319           : base_t{detail::move(begin), detail::move(end)}
56 319           {}
57             template
58             CONCEPT_REQUIRES_(Constructible() && Constructible())>
59             constexpr iterator_range(iterator_range rng)
60             : base_t{detail::move(rng.begin()), detail::move(rng.end())}
61             {}
62             template
63             CONCEPT_REQUIRES_(Constructible() && Constructible())>
64             explicit constexpr iterator_range(std::pair rng)
65             : base_t{detail::move(rng.first), detail::move(rng.second)}
66             {}
67             template
68             CONCEPT_REQUIRES_(Assignable() && Assignable())>
69             iterator_range &operator=(iterator_range rng)
70             {
71             begin() = detail::move(rng).begin();
72             end() = detail::move(rng).end();
73             return *this;
74             }
75             template
76             CONCEPT_REQUIRES_(ConvertibleTo() && ConvertibleTo())>
77             constexpr operator std::pair() const
78             {
79             return {begin(), end()};
80             }
81             constexpr bool empty() const
82             {
83             return begin() == end();
84             }
85             };
86              
87             // Like iterator_range, but with a known size. The first and second members
88             // are private to prevent inadvertent violations of the class invariant.
89             //
90             // Class invariant:
91             // distance(begin(), end()) == size()
92             //
93             template
94             struct sized_iterator_range
95             : view_interface>
96             {
97             private:
98             template
99             friend struct sized_iterator_range;
100             iterator_range rng_;
101             size_type_t size_;
102             public:
103             using iterator = I;
104             using sentinel = S;
105             #ifndef RANGES_DOXYGEN_INVOKED
106             using const_iterator = I; // Mostly to avoid spurious errors in Boost.Range
107             #endif
108              
109             sized_iterator_range() = default;
110             RANGES_NDEBUG_CONSTEXPR sized_iterator_range(I begin, S end, size_type_t size)
111             : rng_{detail::move(begin), detail::move(end)}, size_(size)
112             {
113             #ifndef NDEBUG
114             RANGES_ASSERT(!ForwardIterator() ||
115             static_cast>(ranges::distance(rng_)) == size_);
116             #endif
117             }
118             template
119             CONCEPT_REQUIRES_(Constructible() && Constructible())>
120             RANGES_NDEBUG_CONSTEXPR sized_iterator_range(std::pair rng, size_type_t size)
121             : sized_iterator_range{detail::move(rng).first, detail::move(rng).second, size}
122             {}
123             template
124             CONCEPT_REQUIRES_(Constructible() && Constructible())>
125             RANGES_NDEBUG_CONSTEXPR sized_iterator_range(iterator_range rng, size_type_t size)
126             : sized_iterator_range{detail::move(rng).first(), detail::move(rng).second, size}
127             {}
128             template
129             CONCEPT_REQUIRES_(Constructible() && Constructible())>
130             RANGES_NDEBUG_CONSTEXPR sized_iterator_range(sized_iterator_range rng)
131             : sized_iterator_range{detail::move(rng).rng_.first(), detail::move(rng).rng_.second, rng.size_}
132             {}
133             template
134             CONCEPT_REQUIRES_(Assignable() && Assignable())>
135             sized_iterator_range &operator=(sized_iterator_range rng)
136             {
137             rng_ = detail::move(rng).rng_;
138             size_ = rng.size_;
139             return *this;
140             }
141             I begin() const
142             {
143             return rng_.begin();
144             }
145             S end() const
146             {
147             return rng_.end();
148             }
149             size_type_t size() const
150             {
151             return size_;
152             }
153             template
154             CONCEPT_REQUIRES_(ConvertibleTo() && ConvertibleTo())>
155             constexpr operator std::pair() const
156             {
157             return rng_;
158             }
159             template
160             CONCEPT_REQUIRES_(ConvertibleTo() && ConvertibleTo())>
161             constexpr operator iterator_range() const
162             {
163             return rng_;
164             }
165             constexpr operator iterator_range const &() const & noexcept
166             {
167             return rng_;
168             }
169             };
170              
171             struct make_iterator_range_fn
172             {
173             /// \return `{begin, end}`
174             template
175             CONCEPT_REQUIRES_(Sentinel())>
176             constexpr iterator_range operator()(I begin, S end) const
177             {
178             CONCEPT_ASSERT(Sentinel());
179             return {detail::move(begin), detail::move(end)};
180             }
181              
182             /// \return `{begin, end, size}`
183             template
184             CONCEPT_REQUIRES_(Sentinel())>
185             constexpr sized_iterator_range operator()(I begin, S end, size_type_t size) const
186             {
187             CONCEPT_ASSERT(Sentinel());
188             return {detail::move(begin), detail::move(end), size};
189             }
190             };
191              
192             /// \ingroup group-core
193             /// \sa `make_iterator_range_fn`
194             RANGES_INLINE_VARIABLE(make_iterator_range_fn, make_iterator_range)
195              
196             /// Tuple-like access for `sized_iterator_range`
197             template
198             CONCEPT_REQUIRES_(N < 2)>
199             constexpr auto get(sized_iterator_range const &p)
200             RANGES_DECLTYPE_AUTO_RETURN
201             (
202             ranges::get(static_cast const &>(p))
203             )
204              
205             /// \overload
206             template
207             CONCEPT_REQUIRES_(N == 2)>
208             constexpr size_type_t get(sized_iterator_range const &p)
209             {
210             return p.size();
211             }
212              
213              
214             // TODO add specialization of range_cardinality for when we can determine the range is infinite
215              
216             /// @}
217             }
218             }
219              
220             // The standard is inconsistent about whether these are classes or structs
221             RANGES_DIAGNOSTIC_PUSH
222             RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
223              
224             /// \cond
225             namespace std
226             {
227             template
228             struct tuple_size< ::ranges::v3::iterator_range>
229             : std::integral_constant
230             {};
231              
232             template
233             struct tuple_element<0, ::ranges::v3::iterator_range>
234             {
235             using type = I;
236             };
237              
238             template
239             struct tuple_element<1, ::ranges::v3::iterator_range>
240             {
241             using type = S;
242             };
243              
244             template
245             struct tuple_size< ::ranges::v3::sized_iterator_range>
246             : std::integral_constant
247             {};
248              
249             template
250             struct tuple_element<0, ::ranges::v3::sized_iterator_range>
251             {
252             using type = I;
253             };
254              
255             template
256             struct tuple_element<1, ::ranges::v3::sized_iterator_range>
257             {
258             using type = S;
259             };
260              
261             template
262             struct tuple_element<2, ::ranges::v3::sized_iterator_range>
263             {
264             using type = ::ranges::v3::size_type_t;
265             };
266             }
267             /// \endcond
268              
269             RANGES_DIAGNOSTIC_POP
270              
271             #endif