diff options
Diffstat (limited to 'libstdc++-v3/include/bits/cpp_type_traits.h')
-rw-r--r-- | libstdc++-v3/include/bits/cpp_type_traits.h | 318 |
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 |