diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2010-05-27 17:37:11 +0000 |
---|---|---|
committer | Paolo Carlini <paolo.carlini@oracle.com> | 2010-05-27 17:37:11 +0000 |
commit | 9dc79e8ed25c7dced2347f079221613e62d04692 (patch) | |
tree | f449730c6e302a946c5d8cb6a9822be36cca98a0 /libstdc++-v3/include/bits/cpp_type_traits.h | |
parent | ecb139b68f537045a4d0c5e9d68b306566758a95 (diff) |
2010-05-27 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/40497
* include/bits/cpp_type_traits.h (__is_iterator): Add.
* include/bits/stl_iterator_base_funcs.h (next, prev): Use it.
* testsuite/24_iterators/operations/40497.cc: New.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@159933 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits/cpp_type_traits.h')
-rw-r--r-- | libstdc++-v3/include/bits/cpp_type_traits.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h index 0d7b9ff09fc..8c5d8e9ca27 100644 --- a/libstdc++-v3/include/bits/cpp_type_traits.h +++ b/libstdc++-v3/include/bits/cpp_type_traits.h @@ -414,6 +414,34 @@ _GLIBCXX_BEGIN_NAMESPACE(std) }; #endif + template<typename _Tp> + class __is_iterator_helper + { + 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 + || __is_pointer<_Tp>::__value); + }; + + template<typename _Tp> + struct __is_iterator + { + enum { __value = __is_iterator_helper<_Tp>::__value }; + typedef typename __truth_type<__value>::__type __type; + }; + _GLIBCXX_END_NAMESPACE #endif //_CPP_TYPE_TRAITS_H |