1*e4b17023SJohn Marino// TR2 <type_traits> -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 2011, 2012 Free Software Foundation, Inc. 4*e4b17023SJohn Marino// 5*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 6*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 7*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 8*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 9*e4b17023SJohn Marino// any later version. 10*e4b17023SJohn Marino 11*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 12*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*e4b17023SJohn Marino// GNU General Public License for more details. 15*e4b17023SJohn Marino 16*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 17*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 18*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 19*e4b17023SJohn Marino 20*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 21*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 22*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 24*e4b17023SJohn Marino 25*e4b17023SJohn Marino/** @file tr2/type_traits 26*e4b17023SJohn Marino * This is a TR2 C++ Library header. 27*e4b17023SJohn Marino */ 28*e4b17023SJohn Marino 29*e4b17023SJohn Marino#ifndef _GLIBCXX_TR2_TYPE_TRAITS 30*e4b17023SJohn Marino#define _GLIBCXX_TR2_TYPE_TRAITS 1 31*e4b17023SJohn Marino 32*e4b17023SJohn Marino#pragma GCC system_header 33*e4b17023SJohn Marino#include <type_traits> 34*e4b17023SJohn Marino#include <bits/c++config.h> 35*e4b17023SJohn Marino 36*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 37*e4b17023SJohn Marino{ 38*e4b17023SJohn Marinonamespace tr2 39*e4b17023SJohn Marino{ 40*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 41*e4b17023SJohn Marino 42*e4b17023SJohn Marino /** 43*e4b17023SJohn Marino * @addtogroup metaprogramming 44*e4b17023SJohn Marino * @{ 45*e4b17023SJohn Marino */ 46*e4b17023SJohn Marino 47*e4b17023SJohn Marino /** 48*e4b17023SJohn Marino * See N2965: Type traits and base classes 49*e4b17023SJohn Marino * by Michael Spertus 50*e4b17023SJohn Marino */ 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino /** 53*e4b17023SJohn Marino * Simple typelist. Compile-time list of types. 54*e4b17023SJohn Marino */ 55*e4b17023SJohn Marino template<typename... _Elements> 56*e4b17023SJohn Marino struct __reflection_typelist; 57*e4b17023SJohn Marino 58*e4b17023SJohn Marino /// Specialization for an empty typelist. 59*e4b17023SJohn Marino template<> 60*e4b17023SJohn Marino struct __reflection_typelist<> 61*e4b17023SJohn Marino { 62*e4b17023SJohn Marino typedef std::true_type empty; 63*e4b17023SJohn Marino }; 64*e4b17023SJohn Marino 65*e4b17023SJohn Marino /// Partial specialization. 66*e4b17023SJohn Marino template<typename _First, typename... _Rest> 67*e4b17023SJohn Marino struct __reflection_typelist<_First, _Rest...> 68*e4b17023SJohn Marino { 69*e4b17023SJohn Marino typedef std::false_type empty; 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino struct first 72*e4b17023SJohn Marino { 73*e4b17023SJohn Marino typedef _First type; 74*e4b17023SJohn Marino }; 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino struct rest 77*e4b17023SJohn Marino { 78*e4b17023SJohn Marino typedef __reflection_typelist<_Rest...> type; 79*e4b17023SJohn Marino }; 80*e4b17023SJohn Marino }; 81*e4b17023SJohn Marino 82*e4b17023SJohn Marino /// Sequence abstraction metafunctions for manipulating a typelist. 83*e4b17023SJohn Marino 84*e4b17023SJohn Marino 85*e4b17023SJohn Marino 86*e4b17023SJohn Marino /// Enumerate all the base classes of a class. Form of a typelist. 87*e4b17023SJohn Marino template<typename _Tp> 88*e4b17023SJohn Marino struct bases 89*e4b17023SJohn Marino { 90*e4b17023SJohn Marino typedef __reflection_typelist<__bases(_Tp)...> type; 91*e4b17023SJohn Marino }; 92*e4b17023SJohn Marino 93*e4b17023SJohn Marino /// Enumerate all the direct base classes of a class. Form of a typelist. 94*e4b17023SJohn Marino template<typename _Tp> 95*e4b17023SJohn Marino struct direct_bases 96*e4b17023SJohn Marino { 97*e4b17023SJohn Marino typedef __reflection_typelist<__direct_bases(_Tp)...> type; 98*e4b17023SJohn Marino }; 99*e4b17023SJohn Marino 100*e4b17023SJohn Marino /// @} group metaprogramming 101*e4b17023SJohn Marino 102*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 103*e4b17023SJohn Marino} 104*e4b17023SJohn Marino} 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino#endif // _GLIBCXX_TR2_TYPE_TRAITS 107