initializer_list 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // -*- C++ -*-
  2. //===----------------------- initializer_list -----------------------------===//
  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_INITIALIZER_LIST
  10. #define _LIBCPP_INITIALIZER_LIST
  11. /*
  12. initializer_list synopsis
  13. namespace std
  14. {
  15. template<class E>
  16. class initializer_list
  17. {
  18. public:
  19. typedef E value_type;
  20. typedef const E& reference;
  21. typedef const E& const_reference;
  22. typedef size_t size_type;
  23. typedef const E* iterator;
  24. typedef const E* const_iterator;
  25. initializer_list() noexcept; // constexpr in C++14
  26. size_t size() const noexcept; // constexpr in C++14
  27. const E* begin() const noexcept; // constexpr in C++14
  28. const E* end() const noexcept; // constexpr in C++14
  29. };
  30. template<class E> const E* begin(initializer_list<E> il) noexcept; // constexpr in C++14
  31. template<class E> const E* end(initializer_list<E> il) noexcept; // constexpr in C++14
  32. } // std
  33. */
  34. #include <__config>
  35. #include <cstddef>
  36. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  37. #pragma GCC system_header
  38. #endif
  39. namespace std // purposefully not versioned
  40. {
  41. #ifndef _LIBCPP_CXX03_LANG
  42. template<class _Ep>
  43. class _LIBCPP_TEMPLATE_VIS initializer_list
  44. {
  45. const _Ep* __begin_;
  46. size_t __size_;
  47. _LIBCPP_INLINE_VISIBILITY
  48. _LIBCPP_CONSTEXPR_AFTER_CXX11
  49. initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
  50. : __begin_(__b),
  51. __size_(__s)
  52. {}
  53. public:
  54. typedef _Ep value_type;
  55. typedef const _Ep& reference;
  56. typedef const _Ep& const_reference;
  57. typedef size_t size_type;
  58. typedef const _Ep* iterator;
  59. typedef const _Ep* const_iterator;
  60. _LIBCPP_INLINE_VISIBILITY
  61. _LIBCPP_CONSTEXPR_AFTER_CXX11
  62. initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
  63. _LIBCPP_INLINE_VISIBILITY
  64. _LIBCPP_CONSTEXPR_AFTER_CXX11
  65. size_t size() const _NOEXCEPT {return __size_;}
  66. _LIBCPP_INLINE_VISIBILITY
  67. _LIBCPP_CONSTEXPR_AFTER_CXX11
  68. const _Ep* begin() const _NOEXCEPT {return __begin_;}
  69. _LIBCPP_INLINE_VISIBILITY
  70. _LIBCPP_CONSTEXPR_AFTER_CXX11
  71. const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;}
  72. };
  73. template<class _Ep>
  74. inline _LIBCPP_INLINE_VISIBILITY
  75. _LIBCPP_CONSTEXPR_AFTER_CXX11
  76. const _Ep*
  77. begin(initializer_list<_Ep> __il) _NOEXCEPT
  78. {
  79. return __il.begin();
  80. }
  81. template<class _Ep>
  82. inline _LIBCPP_INLINE_VISIBILITY
  83. _LIBCPP_CONSTEXPR_AFTER_CXX11
  84. const _Ep*
  85. end(initializer_list<_Ep> __il) _NOEXCEPT
  86. {
  87. return __il.end();
  88. }
  89. #endif // !defined(_LIBCPP_CXX03_LANG)
  90. } // std
  91. #endif // _LIBCPP_INITIALIZER_LIST