initializer_list 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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_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_COMPILER_MSVC) && !defined(__clang__)
  37. #include Y_MSVC_INCLUDE_NEXT(yvals.h)
  38. #include Y_MSVC_INCLUDE_NEXT(initializer_list)
  39. #else
  40. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  41. # pragma GCC system_header
  42. #endif
  43. namespace std // purposefully not versioned
  44. {
  45. #ifndef _LIBCPP_CXX03_LANG
  46. template<class _Ep>
  47. class _LIBCPP_TEMPLATE_VIS initializer_list
  48. {
  49. const _Ep* __begin_;
  50. size_t __size_;
  51. _LIBCPP_INLINE_VISIBILITY
  52. _LIBCPP_CONSTEXPR_AFTER_CXX11
  53. initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
  54. : __begin_(__b),
  55. __size_(__s)
  56. {}
  57. public:
  58. typedef _Ep value_type;
  59. typedef const _Ep& reference;
  60. typedef const _Ep& const_reference;
  61. typedef size_t size_type;
  62. typedef const _Ep* iterator;
  63. typedef const _Ep* const_iterator;
  64. _LIBCPP_INLINE_VISIBILITY
  65. _LIBCPP_CONSTEXPR_AFTER_CXX11
  66. initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
  67. initializer_list(const initializer_list&) = default;
  68. initializer_list(initializer_list&&) = default;
  69. initializer_list& operator=(const initializer_list&) = delete;
  70. initializer_list& operator=(initializer_list&&) = delete;
  71. _LIBCPP_INLINE_VISIBILITY
  72. _LIBCPP_CONSTEXPR_AFTER_CXX11
  73. size_t size() const _NOEXCEPT {return __size_;}
  74. _LIBCPP_INLINE_VISIBILITY
  75. _LIBCPP_CONSTEXPR_AFTER_CXX11
  76. const _Ep* begin() const _NOEXCEPT {return __begin_;}
  77. _LIBCPP_INLINE_VISIBILITY
  78. _LIBCPP_CONSTEXPR_AFTER_CXX11
  79. const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;}
  80. };
  81. template<class _Ep>
  82. inline _LIBCPP_INLINE_VISIBILITY
  83. _LIBCPP_CONSTEXPR_AFTER_CXX11
  84. const _Ep*
  85. begin(initializer_list<_Ep> __il) _NOEXCEPT
  86. {
  87. return __il.begin();
  88. }
  89. template<class _Ep>
  90. inline _LIBCPP_INLINE_VISIBILITY
  91. _LIBCPP_CONSTEXPR_AFTER_CXX11
  92. const _Ep*
  93. end(initializer_list<_Ep> __il) _NOEXCEPT
  94. {
  95. return __il.end();
  96. }
  97. #endif // !defined(_LIBCPP_CXX03_LANG)
  98. } // namespace std
  99. #endif // _LIBCPP_COMPILER_MSVC
  100. #endif // _LIBCPP_INITIALIZER_LIST