From 38c0af286d00b7b98a7bde8cc855ec9887c71d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Delrieu?= Date: Tue, 21 Sep 2021 09:27:54 +0200 Subject: [PATCH] detail/iterator_traits: inherit from std::iterator_traits Using Boost.Move breaks range-v3, since the latter specializes std::iterator_traits for its custom iterators. --- include/boost/move/detail/iterator_traits.hpp | 53 +++++++++++-------- include/boost/move/detail/type_traits.hpp | 12 +++++ 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/include/boost/move/detail/iterator_traits.hpp b/include/boost/move/detail/iterator_traits.hpp index d31a72c..7707e4e 100644 --- a/include/boost/move/detail/iterator_traits.hpp +++ b/include/boost/move/detail/iterator_traits.hpp @@ -23,6 +23,7 @@ #endif #include +#include #include #include @@ -38,41 +39,47 @@ struct contiguous_iterator_tag; BOOST_MOVE_STD_NS_END #include -namespace boost{ namespace movelib{ +namespace boost{ namespace move_detail{ -template +// SFINAE correct version of std::iterator_traits, see: +// https://cplusplus.github.io/LWG/issue2951 +template struct iterator_traits { - typedef typename Iterator::difference_type difference_type; - typedef typename Iterator::value_type value_type; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::reference reference; - typedef typename Iterator::iterator_category iterator_category; - typedef typename boost::move_detail::make_unsigned::type size_type; }; -template -struct iterator_traits +template +struct iterator_traits::value, void>::type> + : std::iterator_traits { - typedef std::ptrdiff_t difference_type; - typedef T value_type; - typedef T* pointer; - typedef T& reference; - typedef std::random_access_iterator_tag iterator_category; + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::reference reference; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename boost::move_detail::make_unsigned::type size_type; }; -template -struct iterator_traits +template +struct iterator_traits + : std::iterator_traits { - typedef std::ptrdiff_t difference_type; - typedef T value_type; - typedef const T* pointer; - typedef const T& reference; - typedef std::random_access_iterator_tag iterator_category; + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::reference reference; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename std::iterator_traits::value_type value_type; + typedef typename boost::move_detail::make_unsigned::type size_type; }; +} // namespace move_detail { -}} //namespace boost { namespace movelib{ +namespace movelib{ +template +struct iterator_traits : move_detail::iterator_traits +{ +}; +}} // namespace boost { namespace move_lib { #endif //#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP diff --git a/include/boost/move/detail/type_traits.hpp b/include/boost/move/detail/type_traits.hpp index e44db12..ddaa628 100644 --- a/include/boost/move/detail/type_traits.hpp +++ b/include/boost/move/detail/type_traits.hpp @@ -788,6 +788,18 @@ struct is_class static const bool value = is_class_or_union::value && ! is_union::value; }; +////////////////////////////////////// +// is_object +////////////////////////////////////// + +template +struct is_object +{ + static const bool value = is_scalar::value || + is_array::value || + is_union::value || + is_class::value; +}; ////////////////////////////////////// // is_arithmetic