File Coverage

/usr/include/c++/5/bits/range_access.h
Criterion Covered Total %
statement 4 4 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 4 4 100.0


line stmt bran cond sub pod time code
1             // -*- 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             // .
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
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
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
57             inline auto
58 1161           begin(const _Container& __cont) -> decltype(__cont.begin())
59 1161           { 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
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
77             inline auto
78 1161           end(const _Container& __cont) -> decltype(__cont.end())
79 1161           { 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
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
96             inline _GLIBCXX14_CONSTEXPR _Tp*
97             end(_Tp (&__arr)[_Nm])
98             { return __arr + _Nm; }
99              
100             #if __cplusplus >= 201402L
101              
102             template class valarray;
103             // These overloads must be declared for cbegin and cend to use them.
104             template _Tp* begin(valarray<_Tp>&);
105             template const _Tp* begin(const valarray<_Tp>&);
106             template _Tp* end(valarray<_Tp>&);
107             template const _Tp* end(const valarray<_Tp>&);
108              
109             /**
110             * @brief Return an iterator pointing to the first element of
111             * the const container.
112             * @param __cont Container.
113             */
114             template
115             inline constexpr auto
116             cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
117             -> decltype(std::begin(__cont))
118             { return std::begin(__cont); }
119              
120             /**
121             * @brief Return an iterator pointing to one past the last element of
122             * the const container.
123             * @param __cont Container.
124             */
125             template
126             inline constexpr auto
127             cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
128             -> decltype(std::end(__cont))
129             { return std::end(__cont); }
130              
131             /**
132             * @brief Return a reverse iterator pointing to the last element of
133             * the container.
134             * @param __cont Container.
135             */
136             template
137             inline auto
138             rbegin(_Container& __cont) -> decltype(__cont.rbegin())
139             { return __cont.rbegin(); }
140              
141             /**
142             * @brief Return a reverse iterator pointing to the last element of
143             * the const container.
144             * @param __cont Container.
145             */
146             template
147             inline auto
148             rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
149             { return __cont.rbegin(); }
150              
151             /**
152             * @brief Return a reverse iterator pointing one past the first element of
153             * the container.
154             * @param __cont Container.
155             */
156             template
157             inline auto
158             rend(_Container& __cont) -> decltype(__cont.rend())
159             { return __cont.rend(); }
160              
161             /**
162             * @brief Return a reverse iterator pointing one past the first element of
163             * the const container.
164             * @param __cont Container.
165             */
166             template
167             inline auto
168             rend(const _Container& __cont) -> decltype(__cont.rend())
169             { return __cont.rend(); }
170              
171             /**
172             * @brief Return a reverse iterator pointing to the last element of
173             * the array.
174             * @param __arr Array.
175             */
176             template
177             inline reverse_iterator<_Tp*>
178             rbegin(_Tp (&__arr)[_Nm])
179             { return reverse_iterator<_Tp*>(__arr + _Nm); }
180              
181             /**
182             * @brief Return a reverse iterator pointing one past the first element of
183             * the array.
184             * @param __arr Array.
185             */
186             template
187             inline reverse_iterator<_Tp*>
188             rend(_Tp (&__arr)[_Nm])
189             { return reverse_iterator<_Tp*>(__arr); }
190              
191             /**
192             * @brief Return a reverse iterator pointing to the last element of
193             * the initializer_list.
194             * @param __il initializer_list.
195             */
196             template
197             inline reverse_iterator
198             rbegin(initializer_list<_Tp> __il)
199             { return reverse_iterator(__il.end()); }
200              
201             /**
202             * @brief Return a reverse iterator pointing one past the first element of
203             * the initializer_list.
204             * @param __il initializer_list.
205             */
206             template
207             inline reverse_iterator
208             rend(initializer_list<_Tp> __il)
209             { return reverse_iterator(__il.begin()); }
210              
211             /**
212             * @brief Return a reverse iterator pointing to the last element of
213             * the const container.
214             * @param __cont Container.
215             */
216             template
217             inline auto
218             crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
219             { return std::rbegin(__cont); }
220              
221             /**
222             * @brief Return a reverse iterator pointing one past the first element of
223             * the const container.
224             * @param __cont Container.
225             */
226             template
227             inline auto
228             crend(const _Container& __cont) -> decltype(std::rend(__cont))
229             { return std::rend(__cont); }
230              
231             #endif // C++14
232              
233             _GLIBCXX_END_NAMESPACE_VERSION
234             } // namespace
235              
236             #endif // C++11
237              
238             #endif // _GLIBCXX_RANGE_ACCESS_H