]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/include/tr1/type_traits
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / tr1 / type_traits
index 7fca1b87f7b1589aa33173690055e9f417f78816..719c1b750b48ac4f4d2f27712e1d41e6f29c67b6 100644 (file)
@@ -1,11 +1,11 @@
 // TR1 type_traits -*- C++ -*-
 
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2004-2016 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
 // terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
+// Free Software Foundation; either version 3, or (at your option)
 // any later version.
 
 // This library is distributed in the hope that it will be useful,
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU General Public License for more details.
 
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING.  If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
 
-/** @file 
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file tr1/type_traits
  *  This is a TR1 C++ Library header. 
  */
 
-#ifndef _TYPE_TRAITS
-#define _TYPE_TRAITS 1
+#ifndef _GLIBCXX_TR1_TYPE_TRAITS
+#define _GLIBCXX_TR1_TYPE_TRAITS 1
+
+#pragma GCC system_header
 
 #include <bits/c++config.h>
-#include <tr1/type_traits_fwd.h>
 
-// namespace std::tr1
-namespace std
+namespace std _GLIBCXX_VISIBILITY(default)
 {
 namespace tr1
 {
-  // For use in is_enum, is_function, and elsewhere.
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   * @addtogroup metaprogramming
+   * @{
+   */
+
   struct __sfinae_types
   {
     typedef char __one;
     typedef struct { char __arr[2]; } __two;
   };
 
-#define _DEFINE_SPEC_BODY(_Value)                                    \
+#define _DEFINE_SPEC_0_HELPER                          \
+  template<>
+
+#define _DEFINE_SPEC_1_HELPER                          \
+  template<typename _Tp>
+
+#define _DEFINE_SPEC_2_HELPER                          \
+  template<typename _Tp, typename _Cp>
+
+#define _DEFINE_SPEC(_Order, _Trait, _Type, _Value)    \
+  _DEFINE_SPEC_##_Order##_HELPER                       \
+    struct _Trait<_Type>                               \
     : public integral_constant<bool, _Value> { };
 
-#define _DEFINE_SPEC_0_HELPER(_Spec, _Value)                         \
-  template<>                                                         \
-    struct _Spec                                                     \
-    _DEFINE_SPEC_BODY(_Value)
-
-#define _DEFINE_SPEC_1_HELPER(_Spec, _Value)                         \
-  template<typename _Tp>                                             \
-    struct _Spec                                                     \
-    _DEFINE_SPEC_BODY(_Value)
-      
-#define _DEFINE_SPEC_2_HELPER(_Spec, _Value)                         \
-  template<typename _Tp, typename _Cp>                               \
-    struct _Spec                                                     \
-    _DEFINE_SPEC_BODY(_Value)
-
-#define _DEFINE_SPEC(_Order, _Trait, _Type, _Value)                  \
-  _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type>, _Value)              \
-  _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const>, _Value)        \
-  _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type volatile>, _Value)     \
-  _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const volatile>, _Value)
-
-  /// @brief  helper classes [4.3].
+  // helper classes [4.3].
+
+  /// integral_constant
   template<typename _Tp, _Tp __v>
     struct integral_constant
     {
@@ -72,41 +74,75 @@ namespace tr1
       typedef _Tp                           value_type;
       typedef integral_constant<_Tp, __v>   type;
     };
+  
+  /// typedef for true_type
   typedef integral_constant<bool, true>     true_type;
+
+  /// typedef for false_type
   typedef integral_constant<bool, false>    false_type;
 
-  /// @brief  primary type categories [4.5.1].
+  template<typename _Tp, _Tp __v>
+    const _Tp integral_constant<_Tp, __v>::value;
+
+  /// remove_cv
   template<typename>
-    struct is_void
+    struct remove_cv;
+
+  template<typename>
+    struct __is_void_helper
     : public false_type { };
-  _DEFINE_SPEC(0, is_void, void, true)
+  _DEFINE_SPEC(0, __is_void_helper, void, true)
+
+  // primary type categories [4.5.1].
+
+  /// is_void
+  template<typename _Tp>
+    struct is_void
+    : public integral_constant<bool, (__is_void_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
 
   template<typename>
-    struct is_integral
+    struct __is_integral_helper
     : public false_type { };
-  _DEFINE_SPEC(0, is_integral, bool, true)
-  _DEFINE_SPEC(0, is_integral, char, true)
-  _DEFINE_SPEC(0, is_integral, signed char, true)
-  _DEFINE_SPEC(0, is_integral, unsigned char, true)
+  _DEFINE_SPEC(0, __is_integral_helper, bool, true)
+  _DEFINE_SPEC(0, __is_integral_helper, char, true)
+  _DEFINE_SPEC(0, __is_integral_helper, signed char, true)
+  _DEFINE_SPEC(0, __is_integral_helper, unsigned char, true)
 #ifdef _GLIBCXX_USE_WCHAR_T
-  _DEFINE_SPEC(0, is_integral, wchar_t, true)
+  _DEFINE_SPEC(0, __is_integral_helper, wchar_t, true)
 #endif
-  _DEFINE_SPEC(0, is_integral, short, true)
-  _DEFINE_SPEC(0, is_integral, unsigned short, true)
-  _DEFINE_SPEC(0, is_integral, int, true)
-  _DEFINE_SPEC(0, is_integral, unsigned int, true)
-  _DEFINE_SPEC(0, is_integral, long, true)
-  _DEFINE_SPEC(0, is_integral, unsigned long, true)
-  _DEFINE_SPEC(0, is_integral, long long, true)
-  _DEFINE_SPEC(0, is_integral, unsigned long long, true)
+  _DEFINE_SPEC(0, __is_integral_helper, short, true)
+  _DEFINE_SPEC(0, __is_integral_helper, unsigned short, true)
+  _DEFINE_SPEC(0, __is_integral_helper, int, true)
+  _DEFINE_SPEC(0, __is_integral_helper, unsigned int, true)
+  _DEFINE_SPEC(0, __is_integral_helper, long, true)
+  _DEFINE_SPEC(0, __is_integral_helper, unsigned long, true)
+  _DEFINE_SPEC(0, __is_integral_helper, long long, true)
+  _DEFINE_SPEC(0, __is_integral_helper, unsigned long long, true)
+
+  /// is_integral
+  template<typename _Tp>
+    struct is_integral
+    : public integral_constant<bool, (__is_integral_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
 
   template<typename>
-    struct is_floating_point
+    struct __is_floating_point_helper
     : public false_type { };
-  _DEFINE_SPEC(0, is_floating_point, float, true)
-  _DEFINE_SPEC(0, is_floating_point, double, true)
-  _DEFINE_SPEC(0, is_floating_point, long double, true)
+  _DEFINE_SPEC(0, __is_floating_point_helper, float, true)
+  _DEFINE_SPEC(0, __is_floating_point_helper, double, true)
+  _DEFINE_SPEC(0, __is_floating_point_helper, long double, true)
+
+  /// is_floating_point
+  template<typename _Tp>
+    struct is_floating_point
+    : public integral_constant<bool, (__is_floating_point_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
 
+  /// is_array
   template<typename>
     struct is_array
     : public false_type { };
@@ -120,315 +156,115 @@ namespace tr1
     : public true_type { };
 
   template<typename>
-    struct is_pointer
-    : public false_type { };
-  _DEFINE_SPEC(1, is_pointer, _Tp*, true)
-  template<typename>
-    struct is_reference
+    struct __is_pointer_helper
     : public false_type { };
+  _DEFINE_SPEC(1, __is_pointer_helper, _Tp*, true)
 
+  /// is_pointer
   template<typename _Tp>
-    struct is_reference<_Tp&>
-    : public true_type { };
+    struct is_pointer
+    : public integral_constant<bool, (__is_pointer_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
+
+  /// is_reference
+  template<typename _Tp>
+    struct is_reference;
+
+  /// is_function
+  template<typename _Tp>
+    struct is_function;
 
   template<typename>
-    struct is_member_object_pointer
+    struct __is_member_object_pointer_helper
     : public false_type { };
-  _DEFINE_SPEC(2, is_member_object_pointer, _Tp _Cp::*,
+  _DEFINE_SPEC(2, __is_member_object_pointer_helper, _Tp _Cp::*,
               !is_function<_Tp>::value)
 
-  // Due to c++/19076, for the time being we cannot use the correct, neat
-  // implementation :-(
-  //
-  // template<typename>
-  //   struct is_member_function_pointer
-  //   : public false_type { };
-  // _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*,
-  //             is_function<_Tp>::value)
-  //
-  // Temporary workaround for member functions with up to 15 arguments:
-  template<typename>
-    struct __is_mfp_helper
-    { static const bool __value = false; };
-
-  template<typename _Rt, typename _Cp>
-    struct __is_mfp_helper<_Rt (_Cp::*) ()>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp>
-    struct __is_mfp_helper<_Rt (_Cp::*) (...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, ...)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12, typename _A13>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12,
-                                        _A13)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12, typename _A13>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12,
-                                        _A13, ...)>
-    { static const bool __value = true; };
-
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12, typename _A13, typename _A14>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12,
-                                        _A13, _A14)>
-    { static const bool __value = true; };
-  
-  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
-          typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
-          typename _A8, typename _A9, typename _A10, typename _A11,
-          typename _A12, typename _A13, typename _A14>
-    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
-                                        _A7, _A8, _A9, _A10, _A11, _A12,
-                                        _A13, _A14, ...)>
-    { static const bool __value = true; };
-
+  /// is_member_object_pointer
   template<typename _Tp>
-    struct is_member_function_pointer
-    : public integral_constant<bool, (__is_mfp_helper<typename
-                                     remove_cv<_Tp>::type>::__value)>
+    struct is_member_object_pointer
+    : public integral_constant<bool, (__is_member_object_pointer_helper<
+                                     typename remove_cv<_Tp>::type>::value)>
     { };
 
-  template<typename _Tp, bool = (is_fundamental<_Tp>::value
-                                || is_array<_Tp>::value
-                                || is_pointer<_Tp>::value
-                                || is_reference<_Tp>::value
-                                || is_member_pointer<_Tp>::value
-                                || is_function<_Tp>::value)>
-    struct __is_enum_helper
-    : public __sfinae_types
-    {
-    private:
-      static __one __test(bool);
-      static __one __test(char);
-      static __one __test(signed char);
-      static __one __test(unsigned char);
-#ifdef _GLIBCXX_USE_WCHAR_T
-      static __one __test(wchar_t);
-#endif
-      static __one __test(short);
-      static __one __test(unsigned short);
-      static __one __test(int);
-      static __one __test(unsigned int);
-      static __one __test(long);
-      static __one __test(unsigned long);
-      static __one __test(long long);
-      static __one __test(unsigned long long);
-      static __two __test(...);
-
-      struct __convert
-      { operator _Tp() const; };
-
-    public:
-      static const bool __value = sizeof(__test(__convert())) == 1;
-    };
+  template<typename>
+    struct __is_member_function_pointer_helper
+    : public false_type { };
+  _DEFINE_SPEC(2, __is_member_function_pointer_helper, _Tp _Cp::*,
+              is_function<_Tp>::value)
 
+  /// is_member_function_pointer
   template<typename _Tp>
-    struct __is_enum_helper<_Tp, true>
-    { static const bool __value = false; };
+    struct is_member_function_pointer
+    : public integral_constant<bool, (__is_member_function_pointer_helper<
+                                     typename remove_cv<_Tp>::type>::value)>
+    { };
 
+  /// is_enum
   template<typename _Tp>
     struct is_enum
-    : public integral_constant<bool, __is_enum_helper<_Tp>::__value> { };
+    : public integral_constant<bool, __is_enum(_Tp)>
+    { };
 
-  template<typename _Tp, bool = (is_reference<_Tp>::value
-                                || is_void<_Tp>::value)>
-    struct __is_function_helper
-    : public __sfinae_types
-    {
-    private:
-      template<typename>
-        static __one __test(...);
-      template<typename _Up>
-        static __two __test(_Up(*)[1]);
-    
-    public:
-      static const bool __value = sizeof(__test<_Tp>(0)) == 1;
-    };
-  
+  /// is_union
   template<typename _Tp>
-    struct __is_function_helper<_Tp, true>
-    { static const bool __value = false; };
+    struct is_union
+    : public integral_constant<bool, __is_union(_Tp)>
+    { };
 
+  /// is_class
   template<typename _Tp>
+    struct is_class
+    : public integral_constant<bool, __is_class(_Tp)>
+    { };
+
+  /// is_function
+  template<typename>
     struct is_function
-    : public integral_constant<bool, __is_function_helper<_Tp>::__value> { };
+    : public false_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes...)>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes......)>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes...) const>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes......) const>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes...) volatile>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes......) volatile>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes...) const volatile>
+    : public true_type { };
+  template<typename _Res, typename... _ArgTypes>
+    struct is_function<_Res(_ArgTypes......) const volatile>
+    : public true_type { };
 
-  /// @brief  composite type traits [4.5.2].
+  // composite type traits [4.5.2].
+  
+  /// is_arithmetic
   template<typename _Tp>
     struct is_arithmetic
     : public integral_constant<bool, (is_integral<_Tp>::value
                                      || is_floating_point<_Tp>::value)>
     { };
 
+  /// is_fundamental
   template<typename _Tp>
     struct is_fundamental
     : public integral_constant<bool, (is_arithmetic<_Tp>::value
                                      || is_void<_Tp>::value)>
     { };
 
+  /// is_object
   template<typename _Tp>
     struct is_object
     : public integral_constant<bool, !(is_function<_Tp>::value
@@ -436,6 +272,11 @@ namespace tr1
                                       || is_void<_Tp>::value)>
     { };
 
+  /// is_member_pointer
+  template<typename _Tp>
+    struct is_member_pointer;
+
+  /// is_scalar
   template<typename _Tp>
     struct is_scalar
     : public integral_constant<bool, (is_arithmetic<_Tp>::value
@@ -444,18 +285,25 @@ namespace tr1
                                      || is_member_pointer<_Tp>::value)>
     { };
 
+  /// is_compound
   template<typename _Tp>
     struct is_compound
     : public integral_constant<bool, !is_fundamental<_Tp>::value> { };
 
+  /// is_member_pointer
   template<typename _Tp>
-    struct is_member_pointer
-    : public integral_constant<bool,
-                              (is_member_object_pointer<_Tp>::value
-                               || is_member_function_pointer<_Tp>::value)>
+    struct __is_member_pointer_helper
+    : public false_type { };
+  _DEFINE_SPEC(2, __is_member_pointer_helper, _Tp _Cp::*, true)
+
+  template<typename _Tp>
+  struct is_member_pointer
+    : public integral_constant<bool, (__is_member_pointer_helper<
+                                     typename remove_cv<_Tp>::type>::value)>
     { };
-  
-  /// @brief  type properties [4.5.3].
+
+  // type properties [4.5.3].
+  /// is_const
   template<typename>
     struct is_const
     : public false_type { };
@@ -464,6 +312,7 @@ namespace tr1
     struct is_const<_Tp const>
     : public true_type { };
   
+  /// is_volatile
   template<typename>
     struct is_volatile
     : public false_type { };
@@ -472,55 +321,36 @@ namespace tr1
     struct is_volatile<_Tp volatile>
     : public true_type { };
 
+  /// is_empty
   template<typename _Tp>
-    struct is_pod
-    : public integral_constant<bool, (is_void<_Tp>::value
-                                     || is_scalar<typename
-                                     remove_all_extents<_Tp>::type>::value)>
+    struct is_empty
+    : public integral_constant<bool, __is_empty(_Tp)>
     { };
 
+  /// is_polymorphic
   template<typename _Tp>
-    struct has_trivial_constructor
-    : public integral_constant<bool, is_pod<_Tp>::value> { };
-
-  template<typename _Tp>
-    struct has_trivial_copy
-    : public integral_constant<bool, (is_pod<_Tp>::value 
-                                     && !is_volatile<_Tp>::value)> { };
-
-  template<typename _Tp>
-    struct has_trivial_assign
-    : public integral_constant<bool, (is_pod<_Tp>::value
-                                     && !is_const<_Tp>::value
-                                     && !is_volatile<_Tp>::value)> { };
-
-  template<typename _Tp>
-    struct has_trivial_destructor
-    : public integral_constant<bool, is_pod<_Tp>::value> { };
-
-  template<typename _Tp>
-    struct has_nothrow_constructor
-    : public integral_constant<bool, is_pod<_Tp>::value> { };
+    struct is_polymorphic
+    : public integral_constant<bool, __is_polymorphic(_Tp)>
+    { };
 
+  /// is_abstract
   template<typename _Tp>
-    struct has_nothrow_copy
-    : public integral_constant<bool, (is_pod<_Tp>::value 
-                                     && !is_volatile<_Tp>::value)> { };
+    struct is_abstract
+    : public integral_constant<bool, __is_abstract(_Tp)>
+    { };
 
+  /// has_virtual_destructor
   template<typename _Tp>
-    struct has_nothrow_assign
-    : public integral_constant<bool, (is_pod<_Tp>::value
-                                     && !is_const<_Tp>::value
-                                     && !is_volatile<_Tp>::value)> { };
-
-  template<typename>
     struct has_virtual_destructor
-    : public false_type { };
+    : public integral_constant<bool, __has_virtual_destructor(_Tp)>
+    { };
 
+  /// alignment_of
   template<typename _Tp>
     struct alignment_of
     : public integral_constant<std::size_t, __alignof__(_Tp)> { };
   
+  /// rank
   template<typename>
     struct rank
     : public integral_constant<std::size_t, 0> { };
@@ -532,8 +362,9 @@ namespace tr1
   template<typename _Tp>
     struct rank<_Tp[]>
     : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
-   
-  template<typename, unsigned>
+
+  /// extent
+  template<typename, unsigned _Uint = 0>
     struct extent
     : public integral_constant<std::size_t, 0> { };
   
@@ -550,8 +381,10 @@ namespace tr1
                               _Uint == 0 ? 0 : extent<_Tp,
                                                       _Uint - 1>::value>
     { };
-  
-  /// @brief  relationships between types [4.6].
+
+  // relationships between types [4.6].
+
+  /// is_same
   template<typename, typename>
     struct is_same
     : public false_type { };
@@ -560,7 +393,9 @@ namespace tr1
     struct is_same<_Tp, _Tp>
     : public true_type { };
 
-  /// @brief  const-volatile modifications [4.7.1].
+  // const-volatile modifications [4.7.1].
+
+  /// remove_const
   template<typename _Tp>
     struct remove_const
     { typedef _Tp     type; };
@@ -569,6 +404,7 @@ namespace tr1
     struct remove_const<_Tp const>
     { typedef _Tp     type; };
   
+  /// remove_volatile
   template<typename _Tp>
     struct remove_volatile
     { typedef _Tp     type; };
@@ -577,6 +413,7 @@ namespace tr1
     struct remove_volatile<_Tp volatile>
     { typedef _Tp     type; };
   
+  /// remove_cv
   template<typename _Tp>
     struct remove_cv
     {
@@ -584,14 +421,17 @@ namespace tr1
       remove_const<typename remove_volatile<_Tp>::type>::type     type;
     };
   
+  /// add_const
   template<typename _Tp>
     struct add_const
     { typedef _Tp const     type; };
    
+  /// add_volatile
   template<typename _Tp>
     struct add_volatile
     { typedef _Tp volatile     type; };
   
+  /// add_cv
   template<typename _Tp>
     struct add_cv
     {
@@ -599,24 +439,9 @@ namespace tr1
       add_const<typename add_volatile<_Tp>::type>::type     type;
     };
 
-  /// @brief  reference modifications [4.7.2].
-  template<typename _Tp>
-    struct remove_reference
-    { typedef _Tp     type; };
-
-  template<typename _Tp>
-    struct remove_reference<_Tp&>
-    { typedef _Tp     type; };
-  
-  template<typename _Tp>
-    struct add_reference
-    { typedef _Tp&    type; };
+  // array modifications [4.7.3].
 
-  template<typename _Tp>
-    struct add_reference<_Tp&>
-    { typedef _Tp&    type; };
-
-  /// @brief  array modififications [4.7.3].
+  /// remove_extent
   template<typename _Tp>
     struct remove_extent
     { typedef _Tp     type; };
@@ -629,6 +454,7 @@ namespace tr1
     struct remove_extent<_Tp[]>
     { typedef _Tp     type; };
 
+  /// remove_all_extents
   template<typename _Tp>
     struct remove_all_extents
     { typedef _Tp     type; };
@@ -641,90 +467,209 @@ namespace tr1
     struct remove_all_extents<_Tp[]>
     { typedef typename remove_all_extents<_Tp>::type     type; };
 
-  /// @brief  pointer modifications [4.7.4].
-#undef _DEFINE_SPEC_BODY
-#define _DEFINE_SPEC_BODY(_Value)      \
+  // pointer modifications [4.7.4].
+
+  template<typename _Tp, typename>
+    struct __remove_pointer_helper
     { typedef _Tp     type; };
 
+  template<typename _Tp, typename _Up>
+    struct __remove_pointer_helper<_Tp, _Up*>
+    { typedef _Up     type; };
+
+  /// remove_pointer
   template<typename _Tp>
     struct remove_pointer
-    { typedef _Tp     type; };
-  _DEFINE_SPEC(1, remove_pointer, _Tp*, false)
-  
+    : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
+    { };
+
+  template<typename>
+    struct remove_reference;
+
+  /// add_pointer
   template<typename _Tp>
     struct add_pointer
     { typedef typename remove_reference<_Tp>::type*     type; };
 
-  /// @brief  other transformations [4.8].
-  
-  // Due to c++/19163 and c++/17743, for the time being we cannot use
-  // the correct, neat implementation :-(
-  // 
-  // template<std::size_t _Len, std::size_t _Align>
-  //   struct aligned_storage
-  //   { typedef char type[_Len] __attribute__((__aligned__(_Align))); }
-  //
-  // Temporary workaround, useful for Align up to 32:
-  template<std::size_t, std::size_t>
-    struct aligned_storage { };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 1>
-    {
-      union type
-      {
-       unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(1)));
-      };
-    };
+  template<typename>
+    struct is_reference
+    : public false_type { };
+
+  template<typename _Tp>
+    struct is_reference<_Tp&>
+    : public true_type { };
+
+  template<typename _Tp>
+    struct is_pod
+    : public integral_constant<bool, __is_pod(_Tp) || is_void<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_trivial_constructor
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_trivial_copy
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_trivial_assign
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_trivial_destructor
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_nothrow_constructor
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_nothrow_copy
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
+
+  template<typename _Tp>
+    struct has_nothrow_assign
+    : public integral_constant<bool, is_pod<_Tp>::value>
+    { };
 
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 2>
+  template<typename>
+    struct __is_signed_helper
+    : public false_type { };
+  _DEFINE_SPEC(0, __is_signed_helper, signed char, true)
+  _DEFINE_SPEC(0, __is_signed_helper, short, true)
+  _DEFINE_SPEC(0, __is_signed_helper, int, true)
+  _DEFINE_SPEC(0, __is_signed_helper, long, true)
+  _DEFINE_SPEC(0, __is_signed_helper, long long, true)
+
+  template<typename _Tp>
+    struct is_signed
+    : public integral_constant<bool, (__is_signed_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
+
+  template<typename>
+    struct __is_unsigned_helper
+    : public false_type { };
+  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned char, true)
+  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned short, true)
+  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned int, true)
+  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned long, true)
+  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned long long, true)
+
+  template<typename _Tp>
+    struct is_unsigned
+    : public integral_constant<bool, (__is_unsigned_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
+    { };
+
+  template<typename _Base, typename _Derived>
+    struct __is_base_of_helper
     {
-      union type
-      {
-       unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(2)));
-      };
+      typedef typename remove_cv<_Base>::type    _NoCv_Base;
+      typedef typename remove_cv<_Derived>::type _NoCv_Derived;
+      static const bool __value = (is_same<_Base, _Derived>::value
+                                  || (__is_base_of(_Base, _Derived)
+                                      && !is_same<_NoCv_Base,
+                                                  _NoCv_Derived>::value));
     };
+  template<typename _Base, typename _Derived>
+    struct is_base_of
+    : public integral_constant<bool,
+                              __is_base_of_helper<_Base, _Derived>::__value>
+    { };
 
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 4>
+  template<typename _From, typename _To>
+    struct __is_convertible_simple
+    : public __sfinae_types
     {
-      union type
-      {
-       unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(4)));
-      };
+    private:
+      static __one __test(_To);
+      static __two __test(...);
+      static _From __makeFrom();
+    
+    public:
+      static const bool __value = sizeof(__test(__makeFrom())) == 1;
     };
 
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 8>
+  template<typename _Tp>
+    struct add_reference;
+
+  template<typename _Tp>
+    struct __is_int_or_cref
     {
-      union type
-      {
-       unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(8)));
-      };
+      typedef typename remove_reference<_Tp>::type __rr_Tp;
+      static const bool __value = (is_integral<_Tp>::value
+                                  || (is_integral<__rr_Tp>::value
+                                      && is_const<__rr_Tp>::value
+                                      && !is_volatile<__rr_Tp>::value));
     };
 
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 16>
+  template<typename _From, typename _To,
+          bool = (is_void<_From>::value || is_void<_To>::value
+                  || is_function<_To>::value || is_array<_To>::value
+                  // This special case is here only to avoid warnings. 
+                  || (is_floating_point<typename
+                      remove_reference<_From>::type>::value
+                      && __is_int_or_cref<_To>::__value))>
+    struct __is_convertible_helper
     {
-      union type
-      {
-       unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(16)));
-      };
+      // "An imaginary lvalue of type From...".
+      static const bool __value = (__is_convertible_simple<typename
+                                  add_reference<_From>::type, _To>::__value);
     };
-  
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 32>
-    {
+
+  template<typename _From, typename _To>
+    struct __is_convertible_helper<_From, _To, true>
+    { static const bool __value = (is_void<_To>::value
+                                  || (__is_int_or_cref<_To>::__value
+                                      && !is_void<_From>::value)); };
+
+  template<typename _From, typename _To>
+    struct is_convertible
+    : public integral_constant<bool,
+                              __is_convertible_helper<_From, _To>::__value>
+    { };
+
+  // reference modifications [4.7.2].
+  template<typename _Tp>
+    struct remove_reference
+    { typedef _Tp     type; };
+
+  template<typename _Tp>
+    struct remove_reference<_Tp&>
+    { typedef _Tp     type; };
+
+  // NB: Careful with reference to void.
+  template<typename _Tp, bool = (is_void<_Tp>::value
+                                || is_reference<_Tp>::value)>
+    struct __add_reference_helper
+    { typedef _Tp&    type; };
+
+  template<typename _Tp>
+    struct __add_reference_helper<_Tp, true>
+    { typedef _Tp     type; };
+
+  template<typename _Tp>
+    struct add_reference
+    : public __add_reference_helper<_Tp>
+    { };
+
+  // other transformations [4.8].
+  template<std::size_t _Len, std::size_t _Align>
+    struct aligned_storage
+    { 
       union type
       {
        unsigned char __data[_Len];
-       char __align __attribute__((__aligned__(32)));
+       struct __attribute__((__aligned__((_Align)))) { } __align; 
       };
     };
 
@@ -732,9 +677,11 @@ namespace tr1
 #undef _DEFINE_SPEC_1_HELPER
 #undef _DEFINE_SPEC_2_HELPER
 #undef _DEFINE_SPEC
-#undef _DEFINE_SPEC_BODY
 
+  /// @} group metaprogramming
+
+_GLIBCXX_END_NAMESPACE_VERSION
 }
 }
 
-#endif
+#endif // _GLIBCXX_TR1_TYPE_TRAITS