OSDN Git Service

Licensing changes to GPLv3 resp. GPLv3 with GCC Runtime Exception.
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / tr1_impl / type_traits
index 3c105d6..75b85ea 100644 (file)
@@ -1,11 +1,11 @@
 // TR1 type_traits -*- C++ -*-
 
-// Copyright (C) 2007 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-// 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.
 
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// 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_impl/type_traits
 *  This is an internal header file, included by other library headers.
 *  You should not attempt to use it directly.
 */
 
-#include <tr1_impl/type_traitsfwd.h>
-
 namespace std
 {
 _GLIBCXX_BEGIN_NAMESPACE_TR1
 
+  /**
+   * @defgroup metaprogramming Type Traits
+   * @ingroup utilities
+   *
+   * Compile time type transformation and information.
+   * @{
+   */
+
   // For use in __is_convertible_simple.
   struct __sfinae_types
   {
@@ -45,31 +46,23 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     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
     {
@@ -77,44 +70,79 @@ _GLIBCXX_BEGIN_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;
 
   template<typename _Tp, _Tp __v>
     const _Tp integral_constant<_Tp, __v>::value;
 
-  /// @brief  primary type categories [4.5.1].
+  /// 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
+#ifdef _GLIBCXX_INCLUDE_AS_CXX0X
+  _DEFINE_SPEC(0, __is_integral_helper, char16_t, true)
+  _DEFINE_SPEC(0, __is_integral_helper, char32_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 { };
@@ -128,68 +156,115 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     : public true_type { };
 
   template<typename>
-    struct is_pointer
+    struct __is_pointer_helper
     : public false_type { };
-  _DEFINE_SPEC(1, is_pointer, _Tp*, true)
+  _DEFINE_SPEC(1, __is_pointer_helper, _Tp*, true)
+
+  /// is_pointer
+  template<typename _Tp>
+    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)
 
+  /// is_member_object_pointer
+  template<typename _Tp>
+    struct is_member_object_pointer
+    : public integral_constant<bool, (__is_member_object_pointer_helper<
+                                     typename remove_cv<_Tp>::type>::value)>
+    { };
+
   template<typename>
-    struct is_member_function_pointer
+    struct __is_member_function_pointer_helper
     : public false_type { };
-  _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*,
+  _DEFINE_SPEC(2, __is_member_function_pointer_helper, _Tp _Cp::*,
               is_function<_Tp>::value)
 
+  /// is_member_function_pointer
+  template<typename _Tp>
+    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(_Tp)>
     { };
 
+  /// is_union
   template<typename _Tp>
     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_helper
+    struct is_function
     : public false_type { };
-
   template<typename _Res, typename... _ArgTypes>
-    struct __is_function_helper<_Res(_ArgTypes...)>
+    struct is_function<_Res(_ArgTypes...)>
     : public true_type { };
-
   template<typename _Res, typename... _ArgTypes>
-    struct __is_function_helper<_Res(_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 { };
 
-  template<typename _Tp>
-    struct is_function
-    : public integral_constant<bool, (__is_function_helper<typename
-                                     remove_cv<_Tp>::type>::value)>
-    { };
-
-  /// @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
@@ -197,6 +272,11 @@ _GLIBCXX_BEGIN_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
@@ -205,18 +285,25 @@ _GLIBCXX_BEGIN_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_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_object_pointer<_Tp>::value
-                               || is_member_function_pointer<_Tp>::value)>
+  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 { };
@@ -225,6 +312,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     struct is_const<_Tp const>
     : public true_type { };
   
+  /// is_volatile
   template<typename>
     struct is_volatile
     : public false_type { };
@@ -233,30 +321,36 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     struct is_volatile<_Tp volatile>
     : public true_type { };
 
+  /// is_empty
   template<typename _Tp>
     struct is_empty
     : public integral_constant<bool, __is_empty(_Tp)>
     { };
 
+  /// is_polymorphic
   template<typename _Tp>
     struct is_polymorphic
     : public integral_constant<bool, __is_polymorphic(_Tp)>
     { };
 
+  /// is_abstract
   template<typename _Tp>
     struct is_abstract
     : public integral_constant<bool, __is_abstract(_Tp)>
     { };
 
+  /// has_virtual_destructor
   template<typename _Tp>
     struct has_virtual_destructor
     : 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> { };
@@ -268,8 +362,9 @@ _GLIBCXX_BEGIN_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> { };
   
@@ -286,8 +381,10 @@ _GLIBCXX_BEGIN_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 { };
@@ -296,7 +393,9 @@ _GLIBCXX_BEGIN_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; };
@@ -305,6 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     struct remove_const<_Tp const>
     { typedef _Tp     type; };
   
+  /// remove_volatile
   template<typename _Tp>
     struct remove_volatile
     { typedef _Tp     type; };
@@ -313,6 +413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     struct remove_volatile<_Tp volatile>
     { typedef _Tp     type; };
   
+  /// remove_cv
   template<typename _Tp>
     struct remove_cv
     {
@@ -320,14 +421,17 @@ _GLIBCXX_BEGIN_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
     {
@@ -335,7 +439,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
       add_const<typename add_volatile<_Tp>::type>::type     type;
     };
 
-  /// @brief  array modifications [4.7.3].
+  // array modifications [4.7.3].
+
+  /// remove_extent
   template<typename _Tp>
     struct remove_extent
     { typedef _Tp     type; };
@@ -348,6 +454,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     struct remove_extent<_Tp[]>
     { typedef _Tp     type; };
 
+  /// remove_all_extents
   template<typename _Tp>
     struct remove_all_extents
     { typedef _Tp     type; };
@@ -360,16 +467,26 @@ _GLIBCXX_BEGIN_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; };
@@ -378,7 +495,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
 #undef _DEFINE_SPEC_1_HELPER
 #undef _DEFINE_SPEC_2_HELPER
 #undef _DEFINE_SPEC
-#undef _DEFINE_SPEC_BODY
 
+  // @} group metaprogramming
 _GLIBCXX_END_NAMESPACE_TR1
 }