Home | History | Annotate | Download | only in tr2
      1 // TR2 <type_traits> -*- C++ -*-
      2 
      3 // Copyright (C) 2011-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 tr2/type_traits
     26  *  This is a TR2 C++ Library header.
     27  */
     28 
     29 #ifndef _GLIBCXX_TR2_TYPE_TRAITS
     30 #define _GLIBCXX_TR2_TYPE_TRAITS 1
     31 
     32 #pragma GCC system_header
     33 #include <type_traits>
     34 #include <bits/c++config.h>
     35 
     36 namespace std _GLIBCXX_VISIBILITY(default)
     37 {
     38 namespace tr2
     39 {
     40 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     41 
     42   /**
     43    * @addtogroup metaprogramming
     44    * @{
     45    */
     46 
     47   /**
     48    *  See N2965: Type traits and base classes
     49    *  by Michael Spertus
     50    */
     51 
     52   /**
     53    *  Simple typelist. Compile-time list of types.
     54    */
     55   template<typename... _Elements>
     56     struct __reflection_typelist;
     57 
     58   /// Specialization for an empty typelist.
     59   template<>
     60     struct __reflection_typelist<>
     61     {
     62       typedef std::true_type					empty;
     63     };
     64 
     65   /// Partial specialization.
     66   template<typename _First, typename... _Rest>
     67     struct __reflection_typelist<_First, _Rest...>
     68     {
     69       typedef std::false_type					empty;
     70 
     71       struct first
     72       {
     73 	typedef _First						type;
     74       };
     75 
     76       struct rest
     77       {
     78 	typedef __reflection_typelist<_Rest...>			type;
     79       };
     80     };
     81 
     82   /// Sequence abstraction metafunctions for manipulating a typelist.
     83 
     84 
     85 
     86   /// Enumerate all the base classes of a class. Form of a typelist.
     87   template<typename _Tp>
     88     struct bases
     89     {
     90       typedef __reflection_typelist<__bases(_Tp)...>		type;
     91     };
     92 
     93   /// Enumerate all the direct base classes of a class. Form of a typelist.
     94   template<typename _Tp>
     95     struct direct_bases
     96     {
     97       typedef __reflection_typelist<__direct_bases(_Tp)...>	type;
     98     };
     99 
    100   /// @} group metaprogramming
    101 
    102 _GLIBCXX_END_NAMESPACE_VERSION
    103 }
    104 }
    105 
    106 #endif // _GLIBCXX_TR2_TYPE_TRAITS
    107