xref: /freebsd-src/contrib/llvm-project/libcxx/include/__iterator/access.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1fe6060f1SDimitry Andric // -*- C++ -*-
2fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
3fe6060f1SDimitry Andric //
4fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7fe6060f1SDimitry Andric //
8fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
9fe6060f1SDimitry Andric 
10fe6060f1SDimitry Andric #ifndef _LIBCPP___ITERATOR_ACCESS_H
11fe6060f1SDimitry Andric #define _LIBCPP___ITERATOR_ACCESS_H
12fe6060f1SDimitry Andric 
13fe6060f1SDimitry Andric #include <__config>
14fe6060f1SDimitry Andric #include <cstddef>
15fe6060f1SDimitry Andric 
16fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17fe6060f1SDimitry Andric #  pragma GCC system_header
18fe6060f1SDimitry Andric #endif
19fe6060f1SDimitry Andric 
20fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
21fe6060f1SDimitry Andric 
22fe6060f1SDimitry Andric template <class _Tp, size_t _Np>
23*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* begin(_Tp (&__array)[_Np]) _NOEXCEPT {
24fe6060f1SDimitry Andric   return __array;
25fe6060f1SDimitry Andric }
26fe6060f1SDimitry Andric 
27fe6060f1SDimitry Andric template <class _Tp, size_t _Np>
28*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* end(_Tp (&__array)[_Np]) _NOEXCEPT {
29fe6060f1SDimitry Andric   return __array + _Np;
30fe6060f1SDimitry Andric }
31fe6060f1SDimitry Andric 
32fe6060f1SDimitry Andric #if !defined(_LIBCPP_CXX03_LANG)
33fe6060f1SDimitry Andric 
34fe6060f1SDimitry Andric template <class _Cp>
35*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
36fe6060f1SDimitry Andric auto
37fe6060f1SDimitry Andric begin(_Cp& __c) -> decltype(__c.begin())
38fe6060f1SDimitry Andric {
39fe6060f1SDimitry Andric     return __c.begin();
40fe6060f1SDimitry Andric }
41fe6060f1SDimitry Andric 
42fe6060f1SDimitry Andric template <class _Cp>
43*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
44fe6060f1SDimitry Andric auto
45fe6060f1SDimitry Andric begin(const _Cp& __c) -> decltype(__c.begin())
46fe6060f1SDimitry Andric {
47fe6060f1SDimitry Andric     return __c.begin();
48fe6060f1SDimitry Andric }
49fe6060f1SDimitry Andric 
50fe6060f1SDimitry Andric template <class _Cp>
51*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
52fe6060f1SDimitry Andric auto
53fe6060f1SDimitry Andric end(_Cp& __c) -> decltype(__c.end())
54fe6060f1SDimitry Andric {
55fe6060f1SDimitry Andric     return __c.end();
56fe6060f1SDimitry Andric }
57fe6060f1SDimitry Andric 
58fe6060f1SDimitry Andric template <class _Cp>
59*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17
60fe6060f1SDimitry Andric auto
61fe6060f1SDimitry Andric end(const _Cp& __c) -> decltype(__c.end())
62fe6060f1SDimitry Andric {
63fe6060f1SDimitry Andric     return __c.end();
64fe6060f1SDimitry Andric }
65fe6060f1SDimitry Andric 
6606c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 14
67fe6060f1SDimitry Andric 
68fe6060f1SDimitry Andric template <class _Cp>
69*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto cbegin(const _Cp& __c) noexcept(noexcept(std::begin(__c)))
70*5f757f3fSDimitry Andric     -> decltype(std::begin(__c)) {
71*5f757f3fSDimitry Andric     return std::begin(__c);
72fe6060f1SDimitry Andric }
73fe6060f1SDimitry Andric 
74fe6060f1SDimitry Andric template <class _Cp>
75*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr auto cend(const _Cp& __c) noexcept(noexcept(std::end(__c))) -> decltype(std::end(__c)) {
76*5f757f3fSDimitry Andric     return std::end(__c);
77fe6060f1SDimitry Andric }
78fe6060f1SDimitry Andric 
79fe6060f1SDimitry Andric #endif
80fe6060f1SDimitry Andric 
81fe6060f1SDimitry Andric 
82fe6060f1SDimitry Andric #else  // defined(_LIBCPP_CXX03_LANG)
83fe6060f1SDimitry Andric 
84fe6060f1SDimitry Andric template <class _Cp>
85*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI
86fe6060f1SDimitry Andric typename _Cp::iterator
87fe6060f1SDimitry Andric begin(_Cp& __c)
88fe6060f1SDimitry Andric {
89fe6060f1SDimitry Andric     return __c.begin();
90fe6060f1SDimitry Andric }
91fe6060f1SDimitry Andric 
92fe6060f1SDimitry Andric template <class _Cp>
93*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI
94fe6060f1SDimitry Andric typename _Cp::const_iterator
95fe6060f1SDimitry Andric begin(const _Cp& __c)
96fe6060f1SDimitry Andric {
97fe6060f1SDimitry Andric     return __c.begin();
98fe6060f1SDimitry Andric }
99fe6060f1SDimitry Andric 
100fe6060f1SDimitry Andric template <class _Cp>
101*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI
102fe6060f1SDimitry Andric typename _Cp::iterator
103fe6060f1SDimitry Andric end(_Cp& __c)
104fe6060f1SDimitry Andric {
105fe6060f1SDimitry Andric     return __c.end();
106fe6060f1SDimitry Andric }
107fe6060f1SDimitry Andric 
108fe6060f1SDimitry Andric template <class _Cp>
109*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI
110fe6060f1SDimitry Andric typename _Cp::const_iterator
111fe6060f1SDimitry Andric end(const _Cp& __c)
112fe6060f1SDimitry Andric {
113fe6060f1SDimitry Andric     return __c.end();
114fe6060f1SDimitry Andric }
115fe6060f1SDimitry Andric 
116fe6060f1SDimitry Andric #endif // !defined(_LIBCPP_CXX03_LANG)
117fe6060f1SDimitry Andric 
118fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
119fe6060f1SDimitry Andric 
120fe6060f1SDimitry Andric #endif // _LIBCPP___ITERATOR_ACCESS_H
121