access.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #ifndef _LIBCPP___ITERATOR_ACCESS_H
  10. #define _LIBCPP___ITERATOR_ACCESS_H
  11. #include <__config>
  12. #include <cstddef>
  13. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  14. # pragma GCC system_header
  15. #endif
  16. _LIBCPP_BEGIN_NAMESPACE_STD
  17. template <class _Tp, size_t _Np>
  18. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* begin(_Tp (&__array)[_Np]) _NOEXCEPT {
  19. return __array;
  20. }
  21. template <class _Tp, size_t _Np>
  22. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* end(_Tp (&__array)[_Np]) _NOEXCEPT {
  23. return __array + _Np;
  24. }
  25. #if !defined(_LIBCPP_CXX03_LANG)
  26. template <class _Cp>
  27. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(_Cp& __c) -> decltype(__c.begin()) {
  28. return __c.begin();
  29. }
  30. template <class _Cp>
  31. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(const _Cp& __c) -> decltype(__c.begin()) {
  32. return __c.begin();
  33. }
  34. template <class _Cp>
  35. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(_Cp& __c) -> decltype(__c.end()) {
  36. return __c.end();
  37. }
  38. template <class _Cp>
  39. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(const _Cp& __c) -> decltype(__c.end()) {
  40. return __c.end();
  41. }
  42. # if _LIBCPP_STD_VER >= 14
  43. template <class _Cp>
  44. _LIBCPP_HIDE_FROM_ABI constexpr auto cbegin(const _Cp& __c) noexcept(noexcept(std::begin(__c)))
  45. -> decltype(std::begin(__c)) {
  46. return std::begin(__c);
  47. }
  48. template <class _Cp>
  49. _LIBCPP_HIDE_FROM_ABI constexpr auto cend(const _Cp& __c) noexcept(noexcept(std::end(__c))) -> decltype(std::end(__c)) {
  50. return std::end(__c);
  51. }
  52. # endif
  53. #else // defined(_LIBCPP_CXX03_LANG)
  54. template <class _Cp>
  55. _LIBCPP_HIDE_FROM_ABI typename _Cp::iterator begin(_Cp& __c) {
  56. return __c.begin();
  57. }
  58. template <class _Cp>
  59. _LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator begin(const _Cp& __c) {
  60. return __c.begin();
  61. }
  62. template <class _Cp>
  63. _LIBCPP_HIDE_FROM_ABI typename _Cp::iterator end(_Cp& __c) {
  64. return __c.end();
  65. }
  66. template <class _Cp>
  67. _LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator end(const _Cp& __c) {
  68. return __c.end();
  69. }
  70. #endif // !defined(_LIBCPP_CXX03_LANG)
  71. _LIBCPP_END_NAMESPACE_STD
  72. #endif // _LIBCPP___ITERATOR_ACCESS_H