Home | History | Annotate | Download | only in 4.8
      1 // std::initializer_list support -*- C++ -*-
      2 
      3 // Copyright (C) 2008-2013 Free Software Foundation, Inc.
      4 //
      5 // This file is part of GCC.
      6 //
      7 // GCC is free software; you can redistribute it and/or modify
      8 // it under the terms of the GNU General Public License as published by
      9 // the Free Software Foundation; either version 3, or (at your option)
     10 // any later version.
     11 //
     12 // GCC is distributed in the hope that it will be useful,
     13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 // GNU General Public License for more details.
     16 //
     17 // Under Section 7 of GPL version 3, you are granted additional
     18 // permissions described in the GCC Runtime Library Exception, version
     19 // 3.1, as published by the Free Software Foundation.
     20 
     21 // You should have received a copy of the GNU General Public License and
     22 // a copy of the GCC Runtime Library Exception along with this program;
     23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24 // <http://www.gnu.org/licenses/>.
     25 
     26 /** @file initializer_list
     27  *  This is a Standard C++ Library header.
     28  */
     29 
     30 #ifndef _INITIALIZER_LIST
     31 #define _INITIALIZER_LIST
     32 
     33 #pragma GCC system_header
     34 
     35 #if __cplusplus < 201103L
     36 # include <bits/c++0x_warning.h>
     37 #else // C++0x
     38 
     39 #pragma GCC visibility push(default)
     40 
     41 #include <bits/c++config.h>
     42 
     43 namespace std
     44 {
     45   /// initializer_list
     46   template<class _E>
     47     class initializer_list
     48     {
     49     public:
     50       typedef _E 		value_type;
     51       typedef const _E& 	reference;
     52       typedef const _E& 	const_reference;
     53       typedef size_t 		size_type;
     54       typedef const _E* 	iterator;
     55       typedef const _E* 	const_iterator;
     56 
     57     private:
     58       iterator			_M_array;
     59       size_type			_M_len;
     60 
     61       // The compiler can call a private constructor.
     62       constexpr initializer_list(const_iterator __a, size_type __l)
     63       : _M_array(__a), _M_len(__l) { }
     64 
     65     public:
     66       constexpr initializer_list() noexcept
     67       : _M_array(0), _M_len(0) { }
     68 
     69       // Number of elements.
     70       constexpr size_type
     71       size() const noexcept { return _M_len; }
     72 
     73       // First element.
     74       constexpr const_iterator
     75       begin() const noexcept { return _M_array; }
     76 
     77       // One past the last element.
     78       constexpr const_iterator
     79       end() const noexcept { return begin() + size(); }
     80     };
     81 
     82   /**
     83    *  @brief  Return an iterator pointing to the first element of
     84    *          the initilizer_list.
     85    *  @param  __ils  Initializer list.
     86    */
     87   template<class _Tp>
     88     constexpr const _Tp*
     89     begin(initializer_list<_Tp> __ils) noexcept
     90     { return __ils.begin(); }
     91 
     92   /**
     93    *  @brief  Return an iterator pointing to one past the last element
     94    *          of the initilizer_list.
     95    *  @param  __ils  Initializer list.
     96    */
     97   template<class _Tp>
     98     constexpr const _Tp*
     99     end(initializer_list<_Tp> __ils) noexcept
    100     { return __ils.end(); }
    101 }
    102 
    103 #pragma GCC visibility pop
    104 
    105 #endif // C++11
    106 
    107 #endif // _INITIALIZER_LIST
    108