OSDN Git Service

2001-11-02 Phil Edwards <pme@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / type_traits.h
index fa61137..89e50f3 100644 (file)
@@ -1,3 +1,32 @@
+// Type traits implementation -*- C++ -*-
+
+// Copyright (C) 2001 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)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// 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.
+
+// 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.
+
 /*
  *
  * Copyright (c) 1997
  * purpose.  It is provided "as is" without express or implied warranty.
  */
 
+/** @file type_traits.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
 #ifndef _CPP_BITS_TYPE_TRAITS_H
 #define _CPP_BITS_TYPE_TRAITS_H 1
 
 #pragma GCC system_header
 
-#ifndef _CPP_BITS_STL_CONFIG_H
-#include <bits/stl_config.h>
-#endif
+#include <bits/c++config.h>
 
 /*
 This header file provides a framework for allowing compile time dispatch
@@ -55,10 +87,8 @@ template <class _Tp> inline void copy(_Tp* __source,_Tp* __destination,int __n)
 }
 */
 
-
-template <bool _Truth> struct _Bool {};
-typedef _Bool<true>  __true_type;
-typedef _Bool<false> __false_type;
+struct __true_type {};
+struct __false_type {};
 
 template <class _Tp>
 struct __type_traits { 
@@ -88,14 +118,9 @@ struct __type_traits {
 };
 
 
+// Provide some specializations.
 
-// Provide some specializations.  This is harmless for compilers that
-//  have built-in __types_traits support, and essential for compilers
-//  that don't.
-
-#ifndef __STL_NO_BOOL
-
-__STL_TEMPLATE_NULL struct __type_traits<bool> {
+template<> struct __type_traits<bool> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -103,9 +128,7 @@ __STL_TEMPLATE_NULL struct __type_traits<bool> {
    typedef __true_type    is_POD_type;
 };
 
-#endif /* __STL_NO_BOOL */
-
-__STL_TEMPLATE_NULL struct __type_traits<char> {
+template<> struct __type_traits<char> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -113,7 +136,7 @@ __STL_TEMPLATE_NULL struct __type_traits<char> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<signed char> {
+template<> struct __type_traits<signed char> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -121,7 +144,7 @@ __STL_TEMPLATE_NULL struct __type_traits<signed char> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<unsigned char> {
+template<> struct __type_traits<unsigned char> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -129,9 +152,7 @@ __STL_TEMPLATE_NULL struct __type_traits<unsigned char> {
    typedef __true_type    is_POD_type;
 };
 
-#ifdef __STL_HAS_WCHAR_T
-
-__STL_TEMPLATE_NULL struct __type_traits<wchar_t> {
+template<> struct __type_traits<wchar_t> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -139,9 +160,7 @@ __STL_TEMPLATE_NULL struct __type_traits<wchar_t> {
    typedef __true_type    is_POD_type;
 };
 
-#endif /* __STL_HAS_WCHAR_T */
-
-__STL_TEMPLATE_NULL struct __type_traits<short> {
+template<> struct __type_traits<short> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -149,7 +168,7 @@ __STL_TEMPLATE_NULL struct __type_traits<short> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<unsigned short> {
+template<> struct __type_traits<unsigned short> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -157,7 +176,7 @@ __STL_TEMPLATE_NULL struct __type_traits<unsigned short> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<int> {
+template<> struct __type_traits<int> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -165,7 +184,7 @@ __STL_TEMPLATE_NULL struct __type_traits<int> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<unsigned int> {
+template<> struct __type_traits<unsigned int> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -173,7 +192,7 @@ __STL_TEMPLATE_NULL struct __type_traits<unsigned int> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<long> {
+template<> struct __type_traits<long> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -181,7 +200,7 @@ __STL_TEMPLATE_NULL struct __type_traits<long> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<unsigned long> {
+template<> struct __type_traits<unsigned long> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -189,9 +208,7 @@ __STL_TEMPLATE_NULL struct __type_traits<unsigned long> {
    typedef __true_type    is_POD_type;
 };
 
-#ifdef __STL_LONG_LONG
-
-__STL_TEMPLATE_NULL struct __type_traits<long long> {
+template<> struct __type_traits<long long> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -199,7 +216,7 @@ __STL_TEMPLATE_NULL struct __type_traits<long long> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<unsigned long long> {
+template<> struct __type_traits<unsigned long long> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -207,9 +224,7 @@ __STL_TEMPLATE_NULL struct __type_traits<unsigned long long> {
    typedef __true_type    is_POD_type;
 };
 
-#endif /* __STL_LONG_LONG */
-
-__STL_TEMPLATE_NULL struct __type_traits<float> {
+template<> struct __type_traits<float> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -217,7 +232,7 @@ __STL_TEMPLATE_NULL struct __type_traits<float> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<double> {
+template<> struct __type_traits<double> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -225,7 +240,7 @@ __STL_TEMPLATE_NULL struct __type_traits<double> {
    typedef __true_type    is_POD_type;
 };
 
-__STL_TEMPLATE_NULL struct __type_traits<long double> {
+template<> struct __type_traits<long double> {
    typedef __true_type    has_trivial_default_constructor;
    typedef __true_type    has_trivial_copy_constructor;
    typedef __true_type    has_trivial_assignment_operator;
@@ -233,8 +248,6 @@ __STL_TEMPLATE_NULL struct __type_traits<long double> {
    typedef __true_type    is_POD_type;
 };
 
-#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
-
 template <class _Tp>
 struct __type_traits<_Tp*> {
    typedef __true_type    has_trivial_default_constructor;
@@ -244,58 +257,6 @@ struct __type_traits<_Tp*> {
    typedef __true_type    is_POD_type;
 };
 
-#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
-
-__STL_TEMPLATE_NULL struct __type_traits<char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-__STL_TEMPLATE_NULL struct __type_traits<signed char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-__STL_TEMPLATE_NULL struct __type_traits<unsigned char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-__STL_TEMPLATE_NULL struct __type_traits<const char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-__STL_TEMPLATE_NULL struct __type_traits<const signed char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-__STL_TEMPLATE_NULL struct __type_traits<const unsigned char*> {
-   typedef __true_type    has_trivial_default_constructor;
-   typedef __true_type    has_trivial_copy_constructor;
-   typedef __true_type    has_trivial_assignment_operator;
-   typedef __true_type    has_trivial_destructor;
-   typedef __true_type    is_POD_type;
-};
-
-#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
-
 
 // The following could be written in terms of numeric_limits.  
 // We're doing it separately to reduce the number of dependencies.
@@ -304,78 +265,67 @@ template <class _Tp> struct _Is_integer {
   typedef __false_type _Integral;
 };
 
-#ifndef __STL_NO_BOOL
-
-__STL_TEMPLATE_NULL struct _Is_integer<bool> {
+template<> struct _Is_integer<bool> {
   typedef __true_type _Integral;
 };
 
-#endif /* __STL_NO_BOOL */
-
-__STL_TEMPLATE_NULL struct _Is_integer<char> {
+template<> struct _Is_integer<char> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<signed char> {
+template<> struct _Is_integer<signed char> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<unsigned char> {
+template<> struct _Is_integer<unsigned char> {
   typedef __true_type _Integral;
 };
 
-#ifdef __STL_HAS_WCHAR_T
-
-__STL_TEMPLATE_NULL struct _Is_integer<wchar_t> {
+template<> struct _Is_integer<wchar_t> {
   typedef __true_type _Integral;
 };
 
-#endif /* __STL_HAS_WCHAR_T */
-
-__STL_TEMPLATE_NULL struct _Is_integer<short> {
+template<> struct _Is_integer<short> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<unsigned short> {
+template<> struct _Is_integer<unsigned short> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<int> {
+template<> struct _Is_integer<int> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<unsigned int> {
+template<> struct _Is_integer<unsigned int> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<long> {
+template<> struct _Is_integer<long> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<unsigned long> {
+template<> struct _Is_integer<unsigned long> {
   typedef __true_type _Integral;
 };
 
-#ifdef __STL_LONG_LONG
-
-__STL_TEMPLATE_NULL struct _Is_integer<long long> {
+template<> struct _Is_integer<long long> {
   typedef __true_type _Integral;
 };
 
-__STL_TEMPLATE_NULL struct _Is_integer<unsigned long long> {
+template<> struct _Is_integer<unsigned long long> {
   typedef __true_type _Integral;
 };
 
-#endif /* __STL_LONG_LONG */
-
 template<typename _Tp> struct _Is_normal_iterator {
    typedef __false_type _Normal;
 };
 
 // Forward declaration hack, should really include this from somewhere.
-namespace std {
-   template<typename _Iterator, typename _Container> class __normal_iterator;
-};
+namespace std 
+{
+  template<typename _Iterator, typename _Container> class __normal_iterator;
+}
 
 template<typename _Iterator, typename _Container>
 struct _Is_normal_iterator< std::__normal_iterator<_Iterator, _Container> > {