Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
range.hpp
Go to the documentation of this file.
1
6/*
7 * iterator_range.hpp as proposed http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3350.html by Jeffrey Yasskin <jyasskin@google.com>
8 */
9
10#pragma once
11
12#include <utility>
13#include "iterator.hpp"
14
15namespace ext {
16
23template < typename Iterator >
29 Iterator m_begin;
30
35 Iterator m_end;
36public:
41 typedef Iterator iterator;
42
47 typedef Iterator const_iterator;
48
53 typedef typename std::iterator_traits< Iterator >::value_type value_type;
54
59 iterator_range ( ) = default;
60
68 constexpr iterator_range(Iterator begin, Iterator end) : m_begin ( begin ), m_end ( end ) {
69 }
70
77 constexpr Iterator begin() const {
78 return m_begin;
79 }
80
87 constexpr Iterator end() const {
88 return m_end;
89 }
90
97 constexpr typename std::iterator_traits< Iterator >::reference front() const {
98 return * m_begin;
99 }
100
107 constexpr typename std::iterator_traits< Iterator >::reference back() const {
108 return * ( m_end - 1 );
109 }
110
117 constexpr typename std::iterator_traits< Iterator >::reference operator[](typename std::iterator_traits< Iterator >::difference_type index) const {
118 return m_begin [ index ];
119 }
120
127 constexpr bool empty() const {
128 return m_begin == m_end;
129 }
130
137 constexpr size_t size() const {
138 return std::distance ( m_begin, m_end );
139 }
140
145 void pop_front() {
146 ++ m_begin;
147 }
148
153 void pop_front(typename std::iterator_traits< Iterator >::difference_type n) {
154 m_begin = m_begin + n;
155 }
156
161 void pop_back() {
162 -- m_end;
163 }
164
169 void pop_back(typename std::iterator_traits< Iterator >::difference_type n) {
170 m_end = m_end - n;
171 }
172
181 std::pair< iterator_range, iterator_range > split(typename std::iterator_traits< Iterator >::difference_type index) const {
182 return std::make_pair ( slice ( 0, index ), slice ( index, 0 ) );
183 }
184
203 iterator_range slice(typename std::iterator_traits< Iterator >::difference_type start, typename std::iterator_traits< Iterator >::difference_type stop) const {
204 return iterator_range ( ( start >= 0 ? m_begin : m_end ) + start, ( stop > 0 ? m_begin : m_end ) + stop );
205 }
206
223 iterator_range slice( typename std::iterator_traits< Iterator >::difference_type start) const {
224 return slice ( start, 0 );
225 }
226};
227
234template < typename Iter >
237}
238
246template <class Container>
247auto range ( Container && cont ) -> decltype ( std::forward < Container > ( cont ).range ( ) ) {
248 return ext::make_iterator_range ( std::forward < Container > ( cont ).begin ( ), std::forward < Container > ( cont ).end ( ) );
249}
250
251} /* namespace ext */
252
Implementation of iterator_range, i.e. pair of iterators. The class provides most notably begin and e...
Definition: range.hpp:24
constexpr Iterator end() const
Accessor of the iterator to the end.
Definition: range.hpp:87
void pop_back(typename std::iterator_traits< Iterator >::difference_type n)
Retracts the end iterator n times.
Definition: range.hpp:169
iterator_range slice(typename std::iterator_traits< Iterator >::difference_type start) const
Creates a subrange of the iterator_range representing interaval of values from start to the end of th...
Definition: range.hpp:223
iterator_range()=default
Constructor of empty iterator_range. Both iterators are initialized to default (same) value.
iterator_range slice(typename std::iterator_traits< Iterator >::difference_type start, typename std::iterator_traits< Iterator >::difference_type stop) const
Creates a subrange of the iterator_range representing interaval of values from start to stop.
Definition: range.hpp:203
constexpr std::iterator_traits< Iterator >::reference operator[](typename std::iterator_traits< Iterator >::difference_type index) const
Array subscript operator implementation.
Definition: range.hpp:117
constexpr std::iterator_traits< Iterator >::reference back() const
Getter of the last value in the iterator_range.
Definition: range.hpp:107
constexpr Iterator begin() const
Accessor of the iterator to the begining.
Definition: range.hpp:77
Iterator iterator
Copy of provided iterator.
Definition: range.hpp:41
void pop_front()
Advances the begin iterator.
Definition: range.hpp:145
Iterator const_iterator
Copy of provided const_iterator.
Definition: range.hpp:47
void pop_back()
Retracts the end iterator.
Definition: range.hpp:161
constexpr size_t size() const
Getter of the distance between begin and end iterators.
Definition: range.hpp:137
void pop_front(typename std::iterator_traits< Iterator >::difference_type n)
Advances the begin iterator n times.
Definition: range.hpp:153
std::iterator_traits< Iterator >::value_type value_type
Copy of value_type from the wrapped iterators.
Definition: range.hpp:53
std::pair< iterator_range, iterator_range > split(typename std::iterator_traits< Iterator >::difference_type index) const
Creates two sub ranges based on middle position. The element at the middle position is included in th...
Definition: range.hpp:181
constexpr bool empty() const
Test whether the iterator_range is empty.
Definition: range.hpp:127
constexpr iterator_range(Iterator begin, Iterator end)
Constructor to make iterator_range from pair of iterators.
Definition: range.hpp:68
constexpr std::iterator_traits< Iterator >::reference front() const
Getter of the first value in the iterator_range.
Definition: range.hpp:97
Definition: sigHandler.cpp:20
auto end(Container &&cont) -> decltype(std::forward(cont).end())
Definition: iterator.hpp:912
auto range(Container &&cont) -> decltype(std::forward< Container >(cont).range())
Definition: range.hpp:247
iterator_range< Iter > make_iterator_range(Iter begin, Iter end)
Helper to create iterator_range from two iterators.
Definition: range.hpp:235
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
auto begin(Container &&cont) -> decltype(std::forward(cont).begin())
Definition: iterator.hpp:900
void start(measurements::stealth_string name, measurements::Type type)
Definition: measurements.cpp:14