diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2010-10-05 15:53:35 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2010-10-05 15:53:35 +0000 |
commit | 033b71cea1b4098c37cfd67f3213c4a917caa495 (patch) | |
tree | f737c1e38f42d8941932b0b3af63a2093d031a1d | |
parent | 0378450eec12cf5a84be9d06f5f388cc4b6d934f (diff) | |
download | gcc-033b71cea1b4098c37cfd67f3213c4a917caa495.zip gcc-033b71cea1b4098c37cfd67f3213c4a917caa495.tar.gz gcc-033b71cea1b4098c37cfd67f3213c4a917caa495.tar.bz2 |
type_traits (_GLIBCXX_HAS_NESTED_TYPE): Add.
2010-10-05 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/type_traits (_GLIBCXX_HAS_NESTED_TYPE): Add.
* include/std/functional (_Has_result_type_helper,
_Has_result_type): Remove; use the above to define __has_result_type.
* include/bits/stl_iterator_base_types.h: Use the above to define
__has_iterator_category.
* include/bits/allocator.h (__has_allocator_type): Use the above.
* include/bits/cpp_type_traits.h (__has_iterator_category,
__is_iterator): Remove.
From-SVN: r164993
-rw-r--r-- | libstdc++-v3/ChangeLog | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/allocator.h | 22 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/cpp_type_traits.h | 28 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_iterator_base_types.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/functional | 30 | ||||
-rw-r--r-- | libstdc++-v3/include/std/type_traits | 29 |
6 files changed, 50 insertions, 77 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 97f94fd..c38d749 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2010-10-05 Paolo Carlini <paolo.carlini@oracle.com> + + * include/std/type_traits (_GLIBCXX_HAS_NESTED_TYPE): Add. + * include/std/functional (_Has_result_type_helper, + _Has_result_type): Remove; use the above to define __has_result_type. + * include/bits/stl_iterator_base_types.h: Use the above to define + __has_iterator_category. + * include/bits/allocator.h (__has_allocator_type): Use the above. + * include/bits/cpp_type_traits.h (__has_iterator_category, + __is_iterator): Remove. + 2010-10-05 Sebastian Huber <sebastian.huber@embedded-brains.de> Jonathan Wakely <jwakely.gcc@gmail.com> diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 2d7a4e1..e73ab7e 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -48,7 +48,7 @@ #include <bits/c++allocator.h> #ifdef __GXX_EXPERIMENTAL_CXX0X__ -#include <type_traits> +#include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE #endif _GLIBCXX_BEGIN_NAMESPACE(std) @@ -210,26 +210,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) static const allocator_arg_t allocator_arg = allocator_arg_t(); - template<typename _Tp> - class __has_allocator_type - : public __sfinae_types - { - template<typename _Up> - struct _Wrap_type - { }; - - template<typename _Up> - static __one __test(_Wrap_type<typename _Up::allocator_type>*); - - template<typename _Up> - static __two __test(...); - - public: - static const bool __value = sizeof(__test<_Tp>(0)) == 1; - }; +_GLIBCXX_HAS_NESTED_TYPE(allocator_type) template<typename _Tp, typename _Alloc, - bool = __has_allocator_type<_Tp>::__value> + bool = __has_allocator_type<_Tp>::value> struct __uses_allocator_helper : public false_type { }; diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h index 0304946..0d7b9ff 100644 --- a/libstdc++-v3/include/bits/cpp_type_traits.h +++ b/libstdc++-v3/include/bits/cpp_type_traits.h @@ -414,34 +414,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) }; #endif - template<typename _Tp> - class __has_iterator_category - { - typedef char __one; - typedef struct { char __arr[2]; } __two; - - template<typename _Up> - struct _Wrap_type - { }; - - template<typename _Up> - static __one __test(_Wrap_type<typename _Up::iterator_category>*); - - template<typename _Up> - static __two __test(...); - - public: - static const bool __value = sizeof(__test<_Tp>(0)) == 1; - }; - - template<typename _Tp> - struct __is_iterator - { - enum { __value = (__has_iterator_category<_Tp>::__value - || __is_pointer<_Tp>::__value) }; - typedef typename __truth_type<__value>::__type __type; - }; - _GLIBCXX_END_NAMESPACE #endif //_CPP_TYPE_TRAITS_H diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h b/libstdc++-v3/include/bits/stl_iterator_base_types.h index 20fee58..7b1eafd 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -65,7 +65,7 @@ #include <bits/c++config.h> #ifdef __GXX_EXPERIMENTAL_CXX0X__ -# include <bits/cpp_type_traits.h> // For __has_iterator_category +# include <type_traits> // For _GLIBCXX_HAS_NESTED_TYPE #endif _GLIBCXX_BEGIN_NAMESPACE(std) @@ -137,8 +137,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * provide tighter, more correct semantics. */ #ifdef __GXX_EXPERIMENTAL_CXX0X__ + +_GLIBCXX_HAS_NESTED_TYPE(iterator_category) + template<typename _Iterator, - bool = __has_iterator_category<_Iterator>::__value> + bool = __has_iterator_category<_Iterator>::value> struct __iterator_traits { }; template<typename _Iterator> diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index dcd7ab8..f781d9e 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -63,33 +63,7 @@ namespace std template<typename _MemberPointer> class _Mem_fn; - /** - * Actual implementation of _Has_result_type, which uses SFINAE to - * determine if the type _Tp has a publicly-accessible member type - * result_type. - */ - template<typename _Tp> - class _Has_result_type_helper : __sfinae_types - { - template<typename _Up> - struct _Wrap_type - { }; - - template<typename _Up> - static __one __test(_Wrap_type<typename _Up::result_type>*); - - template<typename _Up> - static __two __test(...); - - public: - static const bool value = sizeof(__test<_Tp>(0)) == 1; - }; - - template<typename _Tp> - struct _Has_result_type - : integral_constant<bool, - _Has_result_type_helper<typename remove_cv<_Tp>::type>::value> - { }; +_GLIBCXX_HAS_NESTED_TYPE(result_type) /// If we have found a result_type, extract it. template<bool _Has_result_type, typename _Functor> @@ -108,7 +82,7 @@ namespace std */ template<typename _Functor> struct _Weak_result_type_impl - : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor> + : _Maybe_get_result_type<__has_result_type<_Functor>::value, _Functor> { }; /// Retrieve the result type for a function type. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index f4d0b26..cde741e 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -696,6 +696,35 @@ namespace std type; }; + /** + * Use SFINAE to determine if the type _Tp has a publicly-accessible + * member type _NTYPE. + */ +#define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \ + template<typename _Tp> \ + class __has_##_NTYPE##_helper \ + : __sfinae_types \ + { \ + template<typename _Up> \ + struct _Wrap_type \ + { }; \ + \ + template<typename _Up> \ + static __one __test(_Wrap_type<typename _Up::_NTYPE>*); \ + \ + template<typename _Up> \ + static __two __test(...); \ + \ + public: \ + static const bool value = sizeof(__test<_Tp>(0)) == 1; \ + }; \ + \ + template<typename _Tp> \ + struct __has_##_NTYPE \ + : integral_constant<bool, __has_##_NTYPE##_helper \ + <typename remove_cv<_Tp>::type>::value> \ + { }; + // @} group metaprogramming } |