Home | History | Annotate | Download | only in bits
      1 // <range_access.h> -*- C++ -*-
      2 
      3 // Copyright (C) 2010-2013 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file bits/range_access.h
     26  *  This is an internal header file, included by other library headers.
     27  *  Do not attempt to use it directly. @headername{iterator}
     28  */
     29 
     30 #ifndef _GLIBCXX_RANGE_ACCESS_H
     31 #define _GLIBCXX_RANGE_ACCESS_H 1
     32 
     33 #pragma GCC system_header
     34 
     35 #if __cplusplus >= 201103L
     36 
     37 namespace std _GLIBCXX_VISIBILITY(default)
     38 {
     39 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     40 
     41   /**
     42    *  @brief  Return an iterator pointing to the first element of
     43    *          the container.
     44    *  @param  __cont  Container.
     45    */
     46   template<class _Container>
     47     inline auto
     48     begin(_Container& __cont) -> decltype(__cont.begin())
     49     { return __cont.begin(); }
     50 
     51   /**
     52    *  @brief  Return an iterator pointing to the first element of
     53    *          the const container.
     54    *  @param  __cont  Container.
     55    */
     56   template<class _Container>
     57     inline auto
     58     begin(const _Container& __cont) -> decltype(__cont.begin())
     59     { return __cont.begin(); }
     60 
     61   /**
     62    *  @brief  Return an iterator pointing to one past the last element of
     63    *          the container.
     64    *  @param  __cont  Container.
     65    */
     66   template<class _Container>
     67     inline auto
     68     end(_Container& __cont) -> decltype(__cont.end())
     69     { return __cont.end(); }
     70 
     71   /**
     72    *  @brief  Return an iterator pointing to one past the last element of
     73    *          the const container.
     74    *  @param  __cont  Container.
     75    */
     76   template<class _Container>
     77     inline auto
     78     end(const _Container& __cont) -> decltype(__cont.end())
     79     { return __cont.end(); }
     80 
     81   /**
     82    *  @brief  Return an iterator pointing to the first element of the array.
     83    *  @param  __arr  Array.
     84    */
     85   template<class _Tp, size_t _Nm>
     86     inline _Tp*
     87     begin(_Tp (&__arr)[_Nm])
     88     { return __arr; }
     89 
     90   /**
     91    *  @brief  Return an iterator pointing to one past the last element
     92    *          of the array.
     93    *  @param  __arr  Array.
     94    */
     95   template<class _Tp, size_t _Nm>
     96     inline _Tp*
     97     end(_Tp (&__arr)[_Nm])
     98     { return __arr + _Nm; }
     99 
    100 _GLIBCXX_END_NAMESPACE_VERSION
    101 } // namespace
    102 
    103 #endif // C++11
    104 
    105 #endif // _GLIBCXX_RANGE_ACCESS_H
    106