aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/cpp_type_traits.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/bits/cpp_type_traits.h')
-rw-r--r--libstdc++-v3/include/bits/cpp_type_traits.h318
1 files changed, 189 insertions, 129 deletions
diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
index d025c8ffe63..feb7b1c93e8 100644
--- a/libstdc++-v3/include/bits/cpp_type_traits.h
+++ b/libstdc++-v3/include/bits/cpp_type_traits.h
@@ -1,6 +1,6 @@
// The -*- C++ -*- type traits classes for internal use in libstdc++
-// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2002, 2003, 2004 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
@@ -42,7 +42,7 @@
//
// This file provides some compile-time information about various types.
// These representations were designed, on purpose, to be constant-expressions
-// and not types as found in <stl/bits/type_traits.h>. In particular, they
+// and not types as found in <bits/type_traits.h>. In particular, they
// can be used in control structures and the optimizer hopefully will do
// the obvious thing.
//
@@ -64,6 +64,26 @@
// -- Gaby (dosreis@cmla.ens-cachan.fr) 2000-03-06.
//
+// NB: g++ can not compile these if declared within the class
+// __is_pod itself.
+namespace __gnu_internal
+{
+ typedef char __one;
+ typedef char __two[2];
+
+ template <typename _Tp>
+ __one __test_type (int _Tp::*);
+ template <typename _Tp>
+ __two& __test_type (...);
+} // namespace __gnu_internal
+
+// Forward declaration hack, should really include this from somewhere.
+namespace __gnu_cxx
+{
+ template<typename _Iterator, typename _Container>
+ class __normal_iterator;
+} // namespace __gnu_cxx
+
namespace std
{
// Compare for equality of types.
@@ -71,18 +91,18 @@ namespace std
struct __are_same
{
enum
- {
- _M_type = 0
- };
+ {
+ _M_type = 0
+ };
};
template<typename _Tp>
struct __are_same<_Tp, _Tp>
{
enum
- {
- _M_type = 1
- };
+ {
+ _M_type = 1
+ };
};
// Define a nested type if some predicate holds.
@@ -92,7 +112,7 @@ namespace std
};
template<typename _Tp>
- struct __enable_if<_Tp, true>
+ struct __enable_if<_Tp, true>
{
typedef _Tp _M_type;
};
@@ -102,18 +122,18 @@ namespace std
struct __is_void
{
enum
- {
- _M_type = 0
- };
+ {
+ _M_type = 0
+ };
};
template<>
struct __is_void<void>
{
enum
- {
- _M_type = 1
- };
+ {
+ _M_type = 1
+ };
};
//
@@ -123,9 +143,9 @@ namespace std
struct __is_integer
{
enum
- {
- _M_type = 0
- };
+ {
+ _M_type = 0
+ };
};
// Thirteen specializations (yes there are eleven standard integer
@@ -135,213 +155,253 @@ namespace std
struct __is_integer<bool>
{
enum
- {
- _M_type = 1
- };
+ {
+ _M_type = 1
+ };
};
template<>
struct __is_integer<char>
{
enum
- {
- _M_type = 1
- };
+ {
+ _M_type = 1
+ };
};
template<>
struct __is_integer<signed char>
{
enum
- {
- _M_type = 1
- };
+ {
+ _M_type = 1
+ };
};
template<>
- struct __is_integer<unsigned char>
- {
- enum
+ struct __is_integer<unsigned char>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
# ifdef _GLIBCXX_USE_WCHAR_T
template<>
- struct __is_integer<wchar_t>
- {
- enum
+ struct __is_integer<wchar_t>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
# endif
template<>
- struct __is_integer<short>
- {
- enum
+ struct __is_integer<short>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<unsigned short>
- {
- enum
+ struct __is_integer<unsigned short>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<int>
- {
- enum
+ struct __is_integer<int>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<unsigned int>
- {
- enum
+ struct __is_integer<unsigned int>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<long>
- {
- enum
+ struct __is_integer<long>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<unsigned long>
- {
- enum
+ struct __is_integer<unsigned long>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<long long>
- {
- enum
+ struct __is_integer<long long>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_integer<unsigned long long>
- {
- enum
+ struct __is_integer<unsigned long long>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
//
// Floating point types
//
template<typename _Tp>
- struct __is_floating
- {
- enum
+ struct __is_floating
{
- _M_type = 0
+ enum
+ {
+ _M_type = 0
+ };
};
- };
// three specializations (float, double and 'long double')
template<>
- struct __is_floating<float>
- {
- enum
+ struct __is_floating<float>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_floating<double>
- {
- enum
+ struct __is_floating<double>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
template<>
- struct __is_floating<long double>
- {
- enum
+ struct __is_floating<long double>
{
- _M_type = 1
+ enum
+ {
+ _M_type = 1
+ };
};
- };
//
- // An arithmetic type is an integer type or a floating point type
+ // Pointer types
//
template<typename _Tp>
- struct __is_arithmetic
- {
- enum
+ struct __is_pointer
+ {
+ enum
+ {
+ _M_type = 0
+ };
+ };
+
+ template<typename _Tp>
+ struct __is_pointer<_Tp*>
{
- _M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type
+ enum
+ {
+ _M_type = 1
+ };
};
- };
//
- // A fundamental type is `void' or and arithmetic type
+ // Normal iterator type
//
template<typename _Tp>
- struct __is_fundamental
- {
- enum
+ struct __is_normal_iterator
+ {
+ enum
+ {
+ _M_type = 0
+ };
+ };
+
+ template<typename _Iterator, typename _Container>
+ struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator,
+ _Container> >
{
- _M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type
+ enum
+ {
+ _M_type = 1
+ };
};
- };
//
- // For the immediate use, the following is a good approximation
+ // An arithmetic type is an integer type or a floating point type
//
+ template<typename _Tp>
+ struct __is_arithmetic
+ {
+ enum
+ {
+ _M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type
+ };
+ };
+
+ //
+ // A fundamental type is `void' or and arithmetic type
+ //
+ template<typename _Tp>
+ struct __is_fundamental
+ {
+ enum
+ {
+ _M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type
+ };
+ };
- // NB: g++ can not compile these if declared within the class
- // __is_pod itself.
- namespace __gnu_internal
- {
- typedef char __one;
- typedef char __two[2];
-
- template <typename _Tp>
- __one __test_type (int _Tp::*);
- template <typename _Tp>
- __two& __test_type (...);
- }
+ //
+ // A trivially copyable type is an arithmetic type or a pointer type
+ //
+ template<typename _Tp>
+ struct __is_trivially_copyable
+ {
+ enum
+ {
+ _M_type = __is_arithmetic<_Tp>::_M_type || __is_pointer<_Tp>::_M_type
+ };
+ };
-
+ //
+ // For the immediate use, the following is a good approximation
+ //
template<typename _Tp>
- struct __is_pod
- {
- enum
+ struct __is_pod
{
- _M_type = (sizeof(__gnu_internal::__test_type<_Tp>(0)) != sizeof(__gnu_internal::__one))
+ enum
+ {
+ _M_type = (sizeof(__gnu_internal::__test_type<_Tp>(0))
+ != sizeof(__gnu_internal::__one))
+ };
};
- };
} // namespace std
-
#endif //_CPP_TYPE_TRAITS_H