LCOV - code coverage report
Current view: top level - usr/include/c++/8/bits - range_access.h (source / functions) Hit Total Coverage
Test: Coverage example Lines: 10 10 100.0 %
Date: 2021-12-02 17:21:05 Functions: 9 9 100.0 %

          Line data    Source code
       1             : // <range_access.h> -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2010-2018 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             : #include <initializer_list>
      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<typename _Container>
      47             :     inline _GLIBCXX17_CONSTEXPR auto
      48          32 :     begin(_Container& __cont) -> decltype(__cont.begin())
      49          32 :     { 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<typename _Container>
      57             :     inline _GLIBCXX17_CONSTEXPR auto
      58          14 :     begin(const _Container& __cont) -> decltype(__cont.begin())
      59          14 :     { 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<typename _Container>
      67             :     inline _GLIBCXX17_CONSTEXPR auto
      68          46 :     end(_Container& __cont) -> decltype(__cont.end())
      69          46 :     { 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<typename _Container>
      77             :     inline _GLIBCXX17_CONSTEXPR auto
      78          14 :     end(const _Container& __cont) -> decltype(__cont.end())
      79          14 :     { 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<typename _Tp, size_t _Nm>
      86             :     inline _GLIBCXX14_CONSTEXPR _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<typename _Tp, size_t _Nm>
      96             :     inline _GLIBCXX14_CONSTEXPR _Tp*
      97             :     end(_Tp (&__arr)[_Nm])
      98             :     { return __arr + _Nm; }
      99             : 
     100             : #if __cplusplus >= 201402L
     101             : 
     102             :   template<typename _Tp> class valarray;
     103             :   // These overloads must be declared for cbegin and cend to use them.
     104             :   template<typename _Tp> _Tp* begin(valarray<_Tp>&);
     105             :   template<typename _Tp> const _Tp* begin(const valarray<_Tp>&);
     106             :   template<typename _Tp> _Tp* end(valarray<_Tp>&);
     107             :   template<typename _Tp> const _Tp* end(const valarray<_Tp>&);
     108             : 
     109             :   /**
     110             :    *  @brief  Return an iterator pointing to the first element of
     111             :    *          the const container.
     112             :    *  @param  __cont  Container.
     113             :    */
     114             :   template<typename _Container>
     115             :     inline constexpr auto
     116             :     cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
     117             :       -> decltype(std::begin(__cont))
     118             :     { return std::begin(__cont); }
     119             : 
     120             :   /**
     121             :    *  @brief  Return an iterator pointing to one past the last element of
     122             :    *          the const container.
     123             :    *  @param  __cont  Container.
     124             :    */
     125             :   template<typename _Container>
     126             :     inline constexpr auto
     127             :     cend(const _Container& __cont) noexcept(noexcept(std::end(__cont)))
     128             :       -> decltype(std::end(__cont))
     129             :     { return std::end(__cont); }
     130             : 
     131             :   /**
     132             :    *  @brief  Return a reverse iterator pointing to the last element of
     133             :    *          the container.
     134             :    *  @param  __cont  Container.
     135             :    */
     136             :   template<typename _Container>
     137             :     inline _GLIBCXX17_CONSTEXPR auto
     138             :     rbegin(_Container& __cont) -> decltype(__cont.rbegin())
     139             :     { return __cont.rbegin(); }
     140             : 
     141             :   /**
     142             :    *  @brief  Return a reverse iterator pointing to the last element of
     143             :    *          the const container.
     144             :    *  @param  __cont  Container.
     145             :    */
     146             :   template<typename _Container>
     147             :     inline _GLIBCXX17_CONSTEXPR auto
     148             :     rbegin(const _Container& __cont) -> decltype(__cont.rbegin())
     149             :     { return __cont.rbegin(); }
     150             : 
     151             :   /**
     152             :    *  @brief  Return a reverse iterator pointing one past the first element of
     153             :    *          the container.
     154             :    *  @param  __cont  Container.
     155             :    */
     156             :   template<typename _Container>
     157             :     inline _GLIBCXX17_CONSTEXPR auto
     158             :     rend(_Container& __cont) -> decltype(__cont.rend())
     159             :     { return __cont.rend(); }
     160             : 
     161             :   /**
     162             :    *  @brief  Return a reverse iterator pointing one past the first element of
     163             :    *          the const container.
     164             :    *  @param  __cont  Container.
     165             :    */
     166             :   template<typename _Container>
     167             :     inline _GLIBCXX17_CONSTEXPR auto
     168             :     rend(const _Container& __cont) -> decltype(__cont.rend())
     169             :     { return __cont.rend(); }
     170             : 
     171             :   /**
     172             :    *  @brief  Return a reverse iterator pointing to the last element of
     173             :    *          the array.
     174             :    *  @param  __arr  Array.
     175             :    */
     176             :   template<typename _Tp, size_t _Nm>
     177             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Tp*>
     178             :     rbegin(_Tp (&__arr)[_Nm])
     179             :     { return reverse_iterator<_Tp*>(__arr + _Nm); }
     180             : 
     181             :   /**
     182             :    *  @brief  Return a reverse iterator pointing one past the first element of
     183             :    *          the array.
     184             :    *  @param  __arr  Array.
     185             :    */
     186             :   template<typename _Tp, size_t _Nm>
     187             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Tp*>
     188             :     rend(_Tp (&__arr)[_Nm])
     189             :     { return reverse_iterator<_Tp*>(__arr); }
     190             : 
     191             :   /**
     192             :    *  @brief  Return a reverse iterator pointing to the last element of
     193             :    *          the initializer_list.
     194             :    *  @param  __il  initializer_list.
     195             :    */
     196             :   template<typename _Tp>
     197             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<const _Tp*>
     198             :     rbegin(initializer_list<_Tp> __il)
     199             :     { return reverse_iterator<const _Tp*>(__il.end()); }
     200             : 
     201             :   /**
     202             :    *  @brief  Return a reverse iterator pointing one past the first element of
     203             :    *          the initializer_list.
     204             :    *  @param  __il  initializer_list.
     205             :    */
     206             :   template<typename _Tp>
     207             :     inline _GLIBCXX17_CONSTEXPR reverse_iterator<const _Tp*>
     208             :     rend(initializer_list<_Tp> __il)
     209             :     { return reverse_iterator<const _Tp*>(__il.begin()); }
     210             : 
     211             :   /**
     212             :    *  @brief  Return a reverse iterator pointing to the last element of
     213             :    *          the const container.
     214             :    *  @param  __cont  Container.
     215             :    */
     216             :   template<typename _Container>
     217             :     inline _GLIBCXX17_CONSTEXPR auto
     218             :     crbegin(const _Container& __cont) -> decltype(std::rbegin(__cont))
     219             :     { return std::rbegin(__cont); }
     220             : 
     221             :   /**
     222             :    *  @brief  Return a reverse iterator pointing one past the first element of
     223             :    *          the const container.
     224             :    *  @param  __cont  Container.
     225             :    */
     226             :   template<typename _Container>
     227             :     inline _GLIBCXX17_CONSTEXPR auto
     228             :     crend(const _Container& __cont) -> decltype(std::rend(__cont))
     229             :     { return std::rend(__cont); }
     230             : 
     231             : #endif // C++14
     232             : 
     233             : #if __cplusplus >= 201703L
     234             : #define __cpp_lib_nonmember_container_access 201411
     235             : 
     236             :   /**
     237             :    *  @brief  Return the size of a container.
     238             :    *  @param  __cont  Container.
     239             :    */
     240             :   template <typename _Container>
     241             :     constexpr auto
     242        3386 :     size(const _Container& __cont) noexcept(noexcept(__cont.size()))
     243             :     -> decltype(__cont.size())
     244        3386 :     { return __cont.size(); }
     245             : 
     246             :   /**
     247             :    *  @brief  Return the size of an array.
     248             :    *  @param  __array  Array.
     249             :    */
     250             :   template <typename _Tp, size_t _Nm>
     251             :     constexpr size_t
     252             :     size(const _Tp (&/*__array*/)[_Nm]) noexcept
     253             :     { return _Nm; }
     254             : 
     255             :   /**
     256             :    *  @brief  Return whether a container is empty.
     257             :    *  @param  __cont  Container.
     258             :    */
     259             :   template <typename _Container>
     260             :     [[nodiscard]] constexpr auto
     261             :     empty(const _Container& __cont) noexcept(noexcept(__cont.empty()))
     262             :     -> decltype(__cont.empty())
     263             :     { return __cont.empty(); }
     264             : 
     265             :   /**
     266             :    *  @brief  Return whether an array is empty (always false).
     267             :    *  @param  __array  Container.
     268             :    */
     269             :   template <typename _Tp, size_t _Nm>
     270             :     [[nodiscard]] constexpr bool
     271             :     empty(const _Tp (&/*__array*/)[_Nm]) noexcept
     272             :     { return false; }
     273             : 
     274             :   /**
     275             :    *  @brief  Return whether an initializer_list is empty.
     276             :    *  @param  __il  Initializer list.
     277             :    */
     278             :   template <typename _Tp>
     279             :     [[nodiscard]] constexpr bool
     280             :     empty(initializer_list<_Tp> __il) noexcept
     281             :     { return __il.size() == 0;}
     282             : 
     283             :   /**
     284             :    *  @brief  Return the data pointer of a container.
     285             :    *  @param  __cont  Container.
     286             :    */
     287             :   template <typename _Container>
     288             :     constexpr auto
     289             :     data(_Container& __cont) noexcept(noexcept(__cont.data()))
     290             :     -> decltype(__cont.data())
     291             :     { return __cont.data(); }
     292             : 
     293             :   /**
     294             :    *  @brief  Return the data pointer of a const container.
     295             :    *  @param  __cont  Container.
     296             :    */
     297             :   template <typename _Container>
     298             :     constexpr auto
     299             :     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
     300             :     -> decltype(__cont.data())
     301             :     { return __cont.data(); }
     302             : 
     303             :   /**
     304             :    *  @brief  Return the data pointer of an array.
     305             :    *  @param  __array  Array.
     306             :    */
     307             :   template <typename _Tp, size_t _Nm>
     308             :     constexpr _Tp*
     309             :     data(_Tp (&__array)[_Nm]) noexcept
     310             :     { return __array; }
     311             : 
     312             :   /**
     313             :    *  @brief  Return the data pointer of an initializer list.
     314             :    *  @param  __il  Initializer list.
     315             :    */
     316             :   template <typename _Tp>
     317             :     constexpr const _Tp*
     318             :     data(initializer_list<_Tp> __il) noexcept
     319             :     { return __il.begin(); }
     320             : 
     321             : #endif // C++17
     322             : 
     323             : _GLIBCXX_END_NAMESPACE_VERSION
     324             : } // namespace
     325             : 
     326             : #endif // C++11
     327             : 
     328             : #endif // _GLIBCXX_RANGE_ACCESS_H

Generated by: LCOV version 1.14