mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
0378450eec
commit
033b71cea1
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 { };
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue