11553Srgrimes// { dg-do run { target c++11 } } 21553Srgrimes 31553Srgrimesnamespace xstd { 41553Srgrimes 51553Srgrimestypedef decltype(sizeof(char)) size_t; 61553Srgrimes 71553Srgrimestemplate<class E> 81553Srgrimesclass initializer_list { 91553Srgrimesprivate: 101553Srgrimes size_t sz; 111553Srgrimes const E* start; 121553Srgrimes 131553Srgrimespublic: 141553Srgrimes typedef E value_type; 151553Srgrimes typedef const E& reference; 161553Srgrimes typedef const E& const_reference; 171553Srgrimes typedef size_t size_type; 181553Srgrimes typedef const E* iterator; 191553Srgrimes typedef const E* const_iterator; 201553Srgrimes 211553Srgrimes constexpr initializer_list() : sz(), start(nullptr) {} 221553Srgrimes 231553Srgrimes template<size_t N> 241553Srgrimes constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {} 251553Srgrimes 261553Srgrimes constexpr size_t size() const { return sz; } 271553Srgrimes 281553Srgrimes constexpr const E* begin() const { return start; } 291553Srgrimes 301553Srgrimes constexpr const E* end() const { return start + sz; } 311553Srgrimes}; 321553Srgrimes 331553Srgrimestemplate<class E, size_t N> 341553Srgrimesconstexpr initializer_list<E> make_list(const E(&array)[N]) { 3531492Swollman return initializer_list<E>(array); 3615648Sjoerg} 3731492Swollman 3831492Swollmantemplate<class E> 3950479SpeterE min(initializer_list<E> list) 401553Srgrimes{ 411553Srgrimes // static_assert(list.size() > 0, "Invalid list"); 421553Srgrimes auto it = list.begin(); 431553Srgrimes E result = *it; 441553Srgrimes for (++it; it != list.end(); ++it) { 4531492Swollman if (*it < result) { 4631492Swollman result = *it; 4731492Swollman } 4831492Swollman } 491553Srgrimes return result; 501553Srgrimes} 511553Srgrimes 521553Srgrimes} 5331492Swollman 5431492Swollmanconstexpr int global_i[] = {2, 4, -5, 6, 10}; 5531492Swollmanconstexpr xstd::initializer_list<int> list(global_i); 5631492Swollman#define SA(X) static_assert(X, #X) 5731492SwollmanSA(list.size() == 5); 5831492SwollmanSA(list.begin()[2] == -5); 591553SrgrimesSA(list.end()[-1] == 10); 601553Srgrimes 611553Srgrimesint main() { 621553Srgrimes if (xstd::min(xstd::make_list(global_i)) != -5) 631553Srgrimes return 1; 641553Srgrimes} 651553Srgrimes