| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | 
							- #ifndef __GBLIBCPP_INITIALIZER_LIST__
 
- #define __GBLIBCPP_INITIALIZER_LIST__
 
- #include <cstddef>
 
- namespace std {
 
- #if defined(__GNUC__)
 
- template <typename T>
 
- class initializer_list {
 
- public:
 
-     using value_type = T;
 
-     using reference = const T&;
 
-     using const_reference = const T&;
 
-     using size_type = std::size_t;
 
-     using iterator = const T*;
 
-     using const_iterator = const T*;
 
- private:
 
-     const T* __begin;
 
-     std::size_t __size;
 
- public:
 
-     constexpr initializer_list() noexcept
 
-         : __begin { }, __size { } { };
 
-     constexpr const T* begin() const noexcept
 
-     { return __begin; }
 
-     constexpr const T* end() const noexcept
 
-     { return __begin + __size; }
 
-     constexpr size_type size() const noexcept
 
-     { return __size; }
 
- };
 
- #elif defined(__clang__)
 
- template <typename T>
 
- class initializer_list {
 
- public:
 
-     using value_type = T;
 
-     using reference = const T&;
 
-     using const_reference = const T&;
 
-     using size_type = std::size_t;
 
-     using iterator = const T*;
 
-     using const_iterator = const T*;
 
- private:
 
-     const T* __begin;
 
-     const T* __end;
 
- public:
 
-     constexpr initializer_list() noexcept
 
-         : __begin { }, __end { } { };
 
-     constexpr const T* begin() const noexcept
 
-     { return __begin; }
 
-     constexpr const T* end() const noexcept
 
-     { return __end; }
 
-     constexpr size_type size() const noexcept
 
-     { return static_cast<size_type>(__end - __begin); }
 
- };
 
- #elif defined(_MSC_VER)
 
- template <typename T>
 
- class initializer_list {
 
- public:
 
-     using value_type = T;
 
-     using reference = const T&;
 
-     using const_reference = const T&;
 
-     using size_type = std::size_t;
 
-     using iterator = const T*;
 
-     using const_iterator = const T*;
 
- private:
 
-     const T* __begin;
 
-     const T* __end;
 
- public:
 
-     constexpr initializer_list() noexcept
 
-         : __begin { }, __end { } { };
 
-     constexpr const T* begin() const noexcept
 
-     { return __begin; }
 
-     constexpr const T* end() const noexcept
 
-     { return __end; }
 
-     constexpr size_type size() const noexcept
 
-     { return static_cast<size_type>(__end - __begin); }
 
- };
 
- #else
 
- template <typename T>
 
- class initializer_list;
 
- #endif
 
- template <typename T>
 
- constexpr const T* begin(initializer_list<T> il) noexcept
 
- { return il.begin(); }
 
- template <typename T>
 
- constexpr const T* end(initializer_list<T> il) noexcept
 
- { return il.end(); }
 
- template <typename T>
 
- [[nodiscard]] constexpr bool empty(initializer_list<T> il) noexcept
 
- { return il.size() == 0; }
 
- template <typename T>
 
- constexpr const T* data(initializer_list<T> il) noexcept
 
- { return il.begin(); }
 
- // TODO: std::rbegin() and std::rend() for std::initializer_list
 
- } // namespace std
 
- #endif
 
 
  |