libstdc++
range_access.h
Go to the documentation of this file.
1 // <range_access.h> -*- C++ -*-
2 
3 // Copyright (C) 2010-2015 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file bits/range_access.h
26  * This is an internal header file, included by other library headers.
27  * Do not attempt to use it directly. @headername{iterator}
28  */
29 
30 #ifndef _GLIBCXX_RANGE_ACCESS_H
31 #define _GLIBCXX_RANGE_ACCESS_H 1
32 
33 #pragma GCC system_header
34 
35 #if __cplusplus >= 201103L
36 #include <initializer_list>
37 namespace std _GLIBCXX_VISIBILITY(default)
38 {
39 _GLIBCXX_BEGIN_NAMESPACE_VERSION
40 
41  /**
42  * @brief Return an iterator pointing to the first element of
43  * the container.
44  * @param __cont Container.
45  */
46  template<class _Container>
47  inline auto
48  begin(_Container& __cont) -> decltype(__cont.begin())
49  { return __cont.begin(); }
50 
51  /**
52  * @brief Return an iterator pointing to the first element of
53  * the const container.
54  * @param __cont Container.
55  */
56  template<class _Container>
57  inline auto
58  begin(const _Container& __cont) -> decltype(__cont.begin())
59  { return __cont.begin(); }
60 
61  /**
62  * @brief Return an iterator pointing to one past the last element of
63  * the container.
64  * @param __cont Container.
65  */
66  template<class _Container>
67  inline auto
68  end(_Container& __cont) -> decltype(__cont.end())
69  { return __cont.end(); }
70 
71  /**
72  * @brief Return an iterator pointing to one past the last element of
73  * the const container.
74  * @param __cont Container.
75  */
76  template<class _Container>
77  inline auto
78  end(const _Container& __cont) -> decltype(__cont.end())
79  { return __cont.end(); }
80 
81  /**
82  * @brief Return an iterator pointing to the first element of the array.
83  * @param __arr Array.
84  */
85  template<class _Tp, size_t _Nm>
86  inline _GLIBCXX14_CONSTEXPR _Tp*
87  begin(_Tp (&__arr)[_Nm])
88  { return __arr; }
89 
90  /**
91  * @brief Return an iterator pointing to one past the last element
92  * of the array.
93  * @param __arr Array.
94  */
95  template<class _Tp, size_t _Nm>
96  inline _GLIBCXX14_CONSTEXPR _Tp*
97  end(_Tp (&__arr)[_Nm])
98  { return __arr + _Nm; }
99 
100 #if __cplusplus >= 201402L
101  /**
102  * @brief Return an iterator pointing to the first element of
103  * the const container.
104  * @param __cont Container.
105  */
106  template<class _Container>
107  inline constexpr auto
108  cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
109  -> decltype(std::begin(__cont))
110  { return std::begin(__cont); }
111 
112  /**
113  * @brief Return an iterator pointing to one past the last element of
114  * the const container.
115  * @param __cont Container.
116  */
117  template<class _Container>
118  inline constexpr auto
119  cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
120  -> decltype(std::end(__cont))
121  { return std::end(__cont); }
122 
123  /**
124  * @brief Return a reverse iterator pointing to the last element of
125  * the container.
126  * @param __cont Container.
127  */
128  template<class _Container>
129  inline auto
130  rbegin(_Container& __cont) -> decltype(__cont.rbegin())
131  { return __cont.rbegin(); }
132 
133  /**
134  * @brief Return a reverse iterator pointing to the last element of
135  * the const container.
136  * @param __cont Container.
137  */
138  template<class _Container>
139  inline auto
140  rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
141  { return __cont.rbegin(); }
142 
143  /**
144  * @brief Return a reverse iterator pointing one past the first element of
145  * the container.
146  * @param __cont Container.
147  */
148  template<class _Container>
149  inline auto
150  rend(_Container& __cont) -> decltype(__cont.rend())
151  { return __cont.rend(); }
152 
153  /**
154  * @brief Return a reverse iterator pointing one past the first element of
155  * the const container.
156  * @param __cont Container.
157  */
158  template<class _Container>
159  inline auto
160  rend(const _Container& __cont) -> decltype(__cont.rend())
161  { return __cont.rend(); }
162 
163  /**
164  * @brief Return a reverse iterator pointing to the last element of
165  * the array.
166  * @param __arr Array.
167  */
168  template<class _Tp, size_t _Nm>
169  inline reverse_iterator<_Tp*>
170  rbegin(_Tp (&__arr)[_Nm])
171  { return reverse_iterator<_Tp*>(__arr + _Nm); }
172 
173  /**
174  * @brief Return a reverse iterator pointing one past the first element of
175  * the array.
176  * @param __arr Array.
177  */
178  template<class _Tp, size_t _Nm>
179  inline reverse_iterator<_Tp*>
180  rend(_Tp (&__arr)[_Nm])
181  { return reverse_iterator<_Tp*>(__arr); }
182 
183  /**
184  * @brief Return a reverse iterator pointing to the last element of
185  * the initializer_list.
186  * @param __il initializer_list.
187  */
188  template<class _Tp>
189  inline reverse_iterator<const _Tp*>
190  rbegin(initializer_list<_Tp> __il)
191  { return reverse_iterator<const _Tp*>(__il.end()); }
192 
193  /**
194  * @brief Return a reverse iterator pointing one past the first element of
195  * the initializer_list.
196  * @param __il initializer_list.
197  */
198  template<class _Tp>
199  inline reverse_iterator<const _Tp*>
200  rend(initializer_list<_Tp> __il)
201  { return reverse_iterator<const _Tp*>(__il.begin()); }
202 
203  /**
204  * @brief Return a reverse iterator pointing to the last element of
205  * the const container.
206  * @param __cont Container.
207  */
208  template<class _Container>
209  inline auto
210  crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
211  { return std::rbegin(__cont); }
212 
213  /**
214  * @brief Return a reverse iterator pointing one past the first element of
215  * the const container.
216  * @param __cont Container.
217  */
218  template<class _Container>
219  inline auto
220  crend(const _Container& __cont) -> decltype(std::rend(__cont))
221  { return std::rend(__cont); }
222 
223 #endif // C++14
224 
225 _GLIBCXX_END_NAMESPACE_VERSION
226 } // namespace
227 
228 #endif // C++11
229 
230 #endif // _GLIBCXX_RANGE_ACCESS_H
auto begin(_Container &__cont) -> decltype(__cont.begin())
Return an iterator pointing to the first element of the container.
Definition: range_access.h:48
auto end(_Container &__cont) -> decltype(__cont.end())
Return an iterator pointing to one past the last element of the container.
Definition: range_access.h:68
ISO C++ entities toplevel namespace is std.