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

          Line data    Source code
       1             : // <utility> -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-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             : /*
      26             :  *
      27             :  * Copyright (c) 1994
      28             :  * Hewlett-Packard Company
      29             :  *
      30             :  * Permission to use, copy, modify, distribute and sell this software
      31             :  * and its documentation for any purpose is hereby granted without fee,
      32             :  * provided that the above copyright notice appear in all copies and
      33             :  * that both that copyright notice and this permission notice appear
      34             :  * in supporting documentation.  Hewlett-Packard Company makes no
      35             :  * representations about the suitability of this software for any
      36             :  * purpose.  It is provided "as is" without express or implied warranty.
      37             :  *
      38             :  *
      39             :  * Copyright (c) 1996,1997
      40             :  * Silicon Graphics Computer Systems, Inc.
      41             :  *
      42             :  * Permission to use, copy, modify, distribute and sell this software
      43             :  * and its documentation for any purpose is hereby granted without fee,
      44             :  * provided that the above copyright notice appear in all copies and
      45             :  * that both that copyright notice and this permission notice appear
      46             :  * in supporting documentation.  Silicon Graphics makes no
      47             :  * representations about the suitability of this software for any
      48             :  * purpose.  It is provided "as is" without express or implied warranty.
      49             :  */
      50             : 
      51             : /** @file include/utility
      52             :  *  This is a Standard C++ Library header.
      53             :  */
      54             : 
      55             : #ifndef _GLIBCXX_UTILITY
      56             : #define _GLIBCXX_UTILITY 1
      57             : 
      58             : #pragma GCC system_header
      59             : 
      60             : /**
      61             :  * @defgroup utilities Utilities
      62             :  *
      63             :  * Components deemed generally useful. Includes pair, tuple,
      64             :  * forward/move helpers, ratio, function object, metaprogramming and
      65             :  * type traits, time, date, and memory functions.
      66             :  */
      67             : 
      68             : #include <bits/c++config.h>
      69             : #include <bits/stl_relops.h>
      70             : #include <bits/stl_pair.h>
      71             : 
      72             : #if __cplusplus >= 201103L
      73             : 
      74             : #include <type_traits>
      75             : #include <bits/move.h>
      76             : #include <initializer_list>
      77             : 
      78             : namespace std _GLIBCXX_VISIBILITY(default)
      79             : {
      80             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      81             : 
      82             :   /// Finds the size of a given tuple type.
      83             :   template<typename _Tp>
      84             :     struct tuple_size;
      85             : 
      86             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
      87             :   // 2313. tuple_size should always derive from integral_constant<size_t, N>
      88             :   // 2770. tuple_size<const T> specialization is not SFINAE compatible
      89             : 
      90             :   template<typename _Tp,
      91             :            typename _Up = typename remove_cv<_Tp>::type,
      92             :            typename = typename enable_if<is_same<_Tp, _Up>::value>::type,
      93             :            size_t = tuple_size<_Tp>::value>
      94             :     using __enable_if_has_tuple_size = _Tp;
      95             : 
      96             :   template<typename _Tp>
      97             :     struct tuple_size<const __enable_if_has_tuple_size<_Tp>>
      98             :     : public tuple_size<_Tp> { };
      99             : 
     100             :   template<typename _Tp>
     101             :     struct tuple_size<volatile __enable_if_has_tuple_size<_Tp>>
     102             :     : public tuple_size<_Tp> { };
     103             : 
     104             :   template<typename _Tp>
     105             :     struct tuple_size<const volatile __enable_if_has_tuple_size<_Tp>>
     106             :     : public tuple_size<_Tp> { };
     107             : 
     108             :   /// Gives the type of the ith element of a given tuple type.
     109             :   template<std::size_t __i, typename _Tp>
     110             :     struct tuple_element;
     111             : 
     112             :   // Duplicate of C++14's tuple_element_t for internal use in C++11 mode
     113             :   template<std::size_t __i, typename _Tp>
     114             :     using __tuple_element_t = typename tuple_element<__i, _Tp>::type;
     115             : 
     116             :   template<std::size_t __i, typename _Tp>
     117             :     struct tuple_element<__i, const _Tp>
     118             :     {
     119             :       typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type;
     120             :     };
     121             : 
     122             :   template<std::size_t __i, typename _Tp>
     123             :     struct tuple_element<__i, volatile _Tp>
     124             :     {
     125             :       typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type;
     126             :     };
     127             : 
     128             :   template<std::size_t __i, typename _Tp>
     129             :     struct tuple_element<__i, const volatile _Tp>
     130             :     {
     131             :       typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
     132             :     };
     133             : 
     134             : #if __cplusplus > 201103L
     135             : #define __cpp_lib_tuple_element_t 201402
     136             : 
     137             :   template<std::size_t __i, typename _Tp>
     138             :     using tuple_element_t = typename tuple_element<__i, _Tp>::type;
     139             : #endif
     140             : 
     141             :   // Various functions which give std::pair a tuple-like interface.
     142             : 
     143             :   /// Partial specialization for std::pair
     144             :   template<typename _T1, typename _T2>
     145             :     struct __is_tuple_like_impl<std::pair<_T1, _T2>> : true_type
     146             :     { };
     147             : 
     148             :   /// Partial specialization for std::pair
     149             :   template<class _Tp1, class _Tp2>
     150             :     struct tuple_size<std::pair<_Tp1, _Tp2>>
     151             :     : public integral_constant<std::size_t, 2> { };
     152             : 
     153             :   /// Partial specialization for std::pair
     154             :   template<class _Tp1, class _Tp2>
     155             :     struct tuple_element<0, std::pair<_Tp1, _Tp2>>
     156             :     { typedef _Tp1 type; };
     157             : 
     158             :   /// Partial specialization for std::pair
     159             :   template<class _Tp1, class _Tp2>
     160             :     struct tuple_element<1, std::pair<_Tp1, _Tp2>>
     161             :     { typedef _Tp2 type; };
     162             : 
     163             :   template<std::size_t _Int>
     164             :     struct __pair_get;
     165             : 
     166             :   template<>
     167             :     struct __pair_get<0>
     168             :     {
     169             :       template<typename _Tp1, typename _Tp2>
     170             :         static constexpr _Tp1&
     171       24239 :         __get(std::pair<_Tp1, _Tp2>& __pair) noexcept
     172       24239 :         { return __pair.first; }
     173             : 
     174             :       template<typename _Tp1, typename _Tp2>
     175             :         static constexpr _Tp1&&
     176             :         __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
     177             :         { return std::forward<_Tp1>(__pair.first); }
     178             : 
     179             :       template<typename _Tp1, typename _Tp2>
     180             :         static constexpr const _Tp1&
     181        6602 :         __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept
     182        6602 :         { return __pair.first; }
     183             : 
     184             :       template<typename _Tp1, typename _Tp2>
     185             :         static constexpr const _Tp1&&
     186             :         __const_move_get(const std::pair<_Tp1, _Tp2>&& __pair) noexcept
     187             :         { return std::forward<const _Tp1>(__pair.first); }
     188             :     };
     189             : 
     190             :   template<>
     191             :     struct __pair_get<1>
     192             :     {
     193             :       template<typename _Tp1, typename _Tp2>
     194             :         static constexpr _Tp2&
     195             :         __get(std::pair<_Tp1, _Tp2>& __pair) noexcept
     196             :         { return __pair.second; }
     197             : 
     198             :       template<typename _Tp1, typename _Tp2>
     199             :         static constexpr _Tp2&&
     200             :         __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
     201             :         { return std::forward<_Tp2>(__pair.second); }
     202             : 
     203             :       template<typename _Tp1, typename _Tp2>
     204             :         static constexpr const _Tp2&
     205             :         __const_get(const std::pair<_Tp1, _Tp2>& __pair) noexcept
     206             :         { return __pair.second; }
     207             : 
     208             :       template<typename _Tp1, typename _Tp2>
     209             :         static constexpr const _Tp2&&
     210             :         __const_move_get(const std::pair<_Tp1, _Tp2>&& __pair) noexcept
     211             :         { return std::forward<const _Tp2>(__pair.second); }
     212             :     };
     213             : 
     214             :   template<std::size_t _Int, class _Tp1, class _Tp2>
     215             :     constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
     216       24239 :     get(std::pair<_Tp1, _Tp2>& __in) noexcept
     217       24239 :     { return __pair_get<_Int>::__get(__in); }
     218             : 
     219             :   template<std::size_t _Int, class _Tp1, class _Tp2>
     220             :     constexpr typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&&
     221             :     get(std::pair<_Tp1, _Tp2>&& __in) noexcept
     222             :     { return __pair_get<_Int>::__move_get(std::move(__in)); }
     223             : 
     224             :   template<std::size_t _Int, class _Tp1, class _Tp2>
     225             :     constexpr const typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
     226        6602 :     get(const std::pair<_Tp1, _Tp2>& __in) noexcept
     227        6602 :     { return __pair_get<_Int>::__const_get(__in); }
     228             : 
     229             :   template<std::size_t _Int, class _Tp1, class _Tp2>
     230             :     constexpr const typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&&
     231             :     get(const std::pair<_Tp1, _Tp2>&& __in) noexcept
     232             :     { return __pair_get<_Int>::__const_move_get(std::move(__in)); }
     233             : 
     234             : #if __cplusplus > 201103L
     235             : 
     236             : #define __cpp_lib_tuples_by_type 201304
     237             : 
     238             :   template <typename _Tp, typename _Up>
     239             :     constexpr _Tp&
     240             :     get(pair<_Tp, _Up>& __p) noexcept
     241             :     { return __p.first; }
     242             : 
     243             :   template <typename _Tp, typename _Up>
     244             :     constexpr const _Tp&
     245             :     get(const pair<_Tp, _Up>& __p) noexcept
     246             :     { return __p.first; }
     247             : 
     248             :   template <typename _Tp, typename _Up>
     249             :     constexpr _Tp&&
     250             :     get(pair<_Tp, _Up>&& __p) noexcept
     251             :     { return std::move(__p.first); }
     252             : 
     253             :   template <typename _Tp, typename _Up>
     254             :     constexpr const _Tp&&
     255             :     get(const pair<_Tp, _Up>&& __p) noexcept
     256             :     { return std::move(__p.first); }
     257             : 
     258             :   template <typename _Tp, typename _Up>
     259             :     constexpr _Tp&
     260             :     get(pair<_Up, _Tp>& __p) noexcept
     261             :     { return __p.second; }
     262             : 
     263             :   template <typename _Tp, typename _Up>
     264             :     constexpr const _Tp&
     265             :     get(const pair<_Up, _Tp>& __p) noexcept
     266             :     { return __p.second; }
     267             : 
     268             :   template <typename _Tp, typename _Up>
     269             :     constexpr _Tp&&
     270             :     get(pair<_Up, _Tp>&& __p) noexcept
     271             :     { return std::move(__p.second); }
     272             : 
     273             :   template <typename _Tp, typename _Up>
     274             :     constexpr const _Tp&&
     275             :     get(const pair<_Up, _Tp>&& __p) noexcept
     276             :     { return std::move(__p.second); }
     277             : 
     278             : #define __cpp_lib_exchange_function 201304
     279             : 
     280             :   /// Assign @p __new_val to @p __obj and return its previous value.
     281             :   template <typename _Tp, typename _Up = _Tp>
     282             :     inline _Tp
     283             :     exchange(_Tp& __obj, _Up&& __new_val)
     284             :     { return std::__exchange(__obj, std::forward<_Up>(__new_val)); }
     285             : #endif
     286             : 
     287             :   // Stores a tuple of indices.  Used by tuple and pair, and by bind() to
     288             :   // extract the elements in a tuple.
     289             :   template<size_t... _Indexes> struct _Index_tuple { };
     290             : 
     291             : #ifdef __has_builtin
     292             : # if __has_builtin(__make_integer_seq)
     293             : #  define _GLIBCXX_USE_MAKE_INTEGER_SEQ 1
     294             : # endif
     295             : #endif
     296             : 
     297             :   // Builds an _Index_tuple<0, 1, 2, ..., _Num-1>.
     298             :   template<size_t _Num>
     299             :     struct _Build_index_tuple
     300             :     {
     301             : #if _GLIBCXX_USE_MAKE_INTEGER_SEQ
     302             :       template<typename, size_t... _Indices>
     303             :         using _IdxTuple = _Index_tuple<_Indices...>;
     304             : 
     305             :       using __type = __make_integer_seq<_IdxTuple, size_t, _Num>;
     306             : #else
     307             :       using __type = _Index_tuple<__integer_pack(_Num)...>;
     308             : #endif
     309             :     };
     310             : 
     311             : #if __cplusplus > 201103L
     312             : 
     313             : #define __cpp_lib_integer_sequence 201304
     314             : 
     315             :   /// Class template integer_sequence
     316             :   template<typename _Tp, _Tp... _Idx>
     317             :     struct integer_sequence
     318             :     {
     319             :       typedef _Tp value_type;
     320             :       static constexpr size_t size() noexcept { return sizeof...(_Idx); }
     321             :     };
     322             : 
     323             :   /// Alias template make_integer_sequence
     324             :   template<typename _Tp, _Tp _Num>
     325             :     using make_integer_sequence
     326             : #if _GLIBCXX_USE_MAKE_INTEGER_SEQ
     327             :       = __make_integer_seq<integer_sequence, _Tp, _Num>;
     328             : #else
     329             :       = integer_sequence<_Tp, __integer_pack(_Num)...>;
     330             : #endif
     331             : 
     332             : #undef _GLIBCXX_USE_MAKE_INTEGER_SEQ
     333             : 
     334             :   /// Alias template index_sequence
     335             :   template<size_t... _Idx>
     336             :     using index_sequence = integer_sequence<size_t, _Idx...>;
     337             : 
     338             :   /// Alias template make_index_sequence
     339             :   template<size_t _Num>
     340             :     using make_index_sequence = make_integer_sequence<size_t, _Num>;
     341             : 
     342             :   /// Alias template index_sequence_for
     343             :   template<typename... _Types>
     344             :     using index_sequence_for = make_index_sequence<sizeof...(_Types)>;
     345             : #endif
     346             : 
     347             : #if __cplusplus > 201402L
     348             : 
     349             :   struct in_place_t {
     350             :     explicit in_place_t() = default;
     351             :   };
     352             : 
     353             :   inline constexpr in_place_t in_place{};
     354             : 
     355             :   template<typename _Tp> struct in_place_type_t
     356             :   {
     357             :     explicit in_place_type_t() = default;
     358             :   };
     359             : 
     360             :   template<typename _Tp>
     361             :     inline constexpr in_place_type_t<_Tp> in_place_type{};
     362             : 
     363             :   template<size_t _Idx> struct in_place_index_t
     364             :   {
     365             :     explicit in_place_index_t() = default;
     366             :   };
     367             : 
     368             :   template<size_t _Idx>
     369             :     inline constexpr in_place_index_t<_Idx> in_place_index{};
     370             : 
     371             :   template<typename>
     372             :     struct __is_in_place_type_impl : false_type
     373             :     { };
     374             : 
     375             :   template<typename _Tp>
     376             :     struct __is_in_place_type_impl<in_place_type_t<_Tp>> : true_type
     377             :     { };
     378             : 
     379             :   template<typename _Tp>
     380             :     struct __is_in_place_type
     381             :       : public __is_in_place_type_impl<_Tp>
     382             :     { };
     383             : 
     384             : #define  __cpp_lib_as_const 201510
     385             :   template<typename _Tp>
     386             :     constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept { return __t; }
     387             : 
     388             :   template<typename _Tp>
     389             :     void as_const(const _Tp&&) = delete;
     390             : 
     391             : #endif // C++17
     392             : 
     393             : _GLIBCXX_END_NAMESPACE_VERSION
     394             : } // namespace
     395             : 
     396             : #endif
     397             : 
     398             : #endif /* _GLIBCXX_UTILITY */

Generated by: LCOV version 1.14