| // { dg-do run { target c++11 } } |
| |
| namespace xstd { |
| |
| typedef decltype(sizeof(char)) size_t; |
| |
| template<class E> |
| class initializer_list { |
| private: |
| size_t sz; |
| const E* start; |
| |
| public: |
| typedef E value_type; |
| typedef const E& reference; |
| typedef const E& const_reference; |
| typedef size_t size_type; |
| typedef const E* iterator; |
| typedef const E* const_iterator; |
| |
| constexpr initializer_list() : sz(), start(nullptr) {} |
| |
| template<size_t N> |
| constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {} |
| |
| constexpr size_t size() const { return sz; } |
| |
| constexpr const E* begin() const { return start; } |
| |
| constexpr const E* end() const { return start + sz; } |
| }; |
| |
| template<class E, size_t N> |
| constexpr initializer_list<E> make_list(const E(&array)[N]) { |
| return initializer_list<E>(array); |
| } |
| |
| template<class E> |
| E min(initializer_list<E> list) |
| { |
| // static_assert(list.size() > 0, "Invalid list"); |
| auto it = list.begin(); |
| E result = *it; |
| for (++it; it != list.end(); ++it) { |
| if (*it < result) { |
| result = *it; |
| } |
| } |
| return result; |
| } |
| |
| } |
| |
| constexpr int global_i[] = {2, 4, -5, 6, 10}; |
| constexpr xstd::initializer_list<int> list(global_i); |
| #define SA(X) static_assert(X, #X) |
| SA(list.size() == 5); |
| SA(list.begin()[2] == -5); |
| SA(list.end()[-1] == 10); |
| |
| int main() { |
| if (xstd::min(xstd::make_list(global_i)) != -5) |
| return 1; |
| } |