From 7ddbf15868c1180f3be70c18a8e6008183d4a332 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Sun, 26 Jan 2025 19:08:40 +0300 Subject: [PATCH] Removed MPL usage from iterator_archetypes.hpp. --- .../boost/iterator/iterator_archetypes.hpp | 598 +++++++++--------- 1 file changed, 287 insertions(+), 311 deletions(-) diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp index 6696445..afeea88 100644 --- a/include/boost/iterator/iterator_archetypes.hpp +++ b/include/boost/iterator/iterator_archetypes.hpp @@ -7,21 +7,14 @@ #define BOOST_ITERATOR_ARCHETYPES_HPP #include -#include - #include -#include - +#include #include - -#include -#include -#include -#include -#include +#include #include +#include namespace boost { namespace iterators { @@ -32,252 +25,253 @@ struct access_archetype; template struct traversal_archetype; -namespace archetypes +namespace archetypes { + +enum { - enum { - readable_iterator_bit = 1 - , writable_iterator_bit = 2 - , swappable_iterator_bit = 4 - , lvalue_iterator_bit = 8 - }; + readable_iterator_bit = 1, + writable_iterator_bit = 2, + swappable_iterator_bit = 4, + lvalue_iterator_bit = 8 +}; - // Not quite tags, since dispatching wouldn't work. - typedef mpl::int_::type readable_iterator_t; - typedef mpl::int_::type writable_iterator_t; +// Not quite tags, since dispatching wouldn't work. +using readable_iterator_t = std::integral_constant; +using writable_iterator_t = std::integral_constant; - typedef mpl::int_< - (readable_iterator_bit|writable_iterator_bit) - >::type readable_writable_iterator_t; +using readable_writable_iterator_t = std::integral_constant< + unsigned int, + (readable_iterator_bit | writable_iterator_bit) +>; - typedef mpl::int_< - (readable_iterator_bit|lvalue_iterator_bit) - >::type readable_lvalue_iterator_t; +using readable_lvalue_iterator_t = std::integral_constant< + unsigned int, + (readable_iterator_bit | lvalue_iterator_bit) +>; - typedef mpl::int_< - (lvalue_iterator_bit|writable_iterator_bit) - >::type writable_lvalue_iterator_t; +using writable_lvalue_iterator_t = std::integral_constant< + unsigned int, + (lvalue_iterator_bit | writable_iterator_bit) +>; - typedef mpl::int_::type swappable_iterator_t; - typedef mpl::int_::type lvalue_iterator_t; +using swappable_iterator_t = std::integral_constant; +using lvalue_iterator_t = std::integral_constant; - template - struct has_access - : mpl::equal_to< - mpl::bitand_ - , Base - > - {}; -} +template +struct has_access : + public std::integral_constant +{}; -namespace detail +} // namespace archetypes + +namespace detail { + +template +struct assign_proxy { - template - struct assign_proxy - { - assign_proxy& operator=(T) { return *this; } - }; + assign_proxy& operator=(T) { return *this; } +}; - template - struct read_proxy - { - operator T() { return static_object::get(); } - }; +template +struct read_proxy +{ + operator T() { return static_object::get(); } +}; - template - struct read_write_proxy - : read_proxy // Use to inherit from assign_proxy, but that doesn't work. -JGS - { - read_write_proxy& operator=(T) { return *this; } - }; +template +struct read_write_proxy : + public read_proxy // Used to inherit from assign_proxy, but that doesn't work. -JGS +{ + read_write_proxy& operator=(T) { return *this; } +}; - template - struct arrow_proxy - { - T const* operator->() const { return 0; } - }; +template +struct arrow_proxy +{ + T const* operator->() const { return 0; } +}; - struct no_operator_brackets {}; +struct no_operator_brackets {}; - template - struct readable_operator_brackets - { - read_proxy operator[](std::ptrdiff_t n) const { return read_proxy(); } - }; +template +struct readable_operator_brackets +{ + read_proxy operator[](std::ptrdiff_t n) const { return read_proxy(); } +}; - template - struct writable_operator_brackets - { - read_write_proxy operator[](std::ptrdiff_t n) const { return read_write_proxy(); } - }; +template +struct writable_operator_brackets +{ + read_write_proxy operator[](std::ptrdiff_t n) const { return read_write_proxy(); } +}; - template - struct operator_brackets - : mpl::eval_if< - std::is_convertible - , mpl::eval_if< - archetypes::has_access< - AccessCategory - , archetypes::writable_iterator_t - > - , mpl::identity > - , std::conditional< - archetypes::has_access< - AccessCategory - , archetypes::readable_iterator_t - >::value - , readable_operator_brackets - , no_operator_brackets - > - > - , mpl::identity - >::type - {}; +template +struct operator_brackets : + public mp11::mp_eval_if_c< + !std::is_convertible::value, + no_operator_brackets, + mp11::mp_cond, + archetypes::has_access, writable_operator_brackets, + archetypes::has_access, readable_operator_brackets, + std::true_type, no_operator_brackets + > +{}; - template - struct traversal_archetype_impl - { - template struct archetype; - }; +template +struct traversal_archetype_impl +{ + template struct archetype; +}; - // Constructor argument for those iterators that - // are not default constructible - struct ctor_arg {}; +// Constructor argument for those iterators that +// are not default constructible +struct ctor_arg {}; - template - struct traversal_archetype_ - : traversal_archetype_impl::template archetype - { - typedef typename - traversal_archetype_impl::template archetype - base; +template +struct traversal_archetype_ : + public traversal_archetype_impl::template archetype +{ + using base = typename traversal_archetype_impl::template archetype; - traversal_archetype_() {} + traversal_archetype_() {} - traversal_archetype_(ctor_arg arg) - : base(arg) - {} - }; + traversal_archetype_(ctor_arg arg) : base(arg) + {} +}; - template <> - struct traversal_archetype_impl - { - template - struct archetype - { - explicit archetype(ctor_arg) {} +template <> +struct traversal_archetype_impl +{ + template + struct archetype + { + explicit archetype(ctor_arg) {} - struct bogus { }; // This use to be void, but that causes trouble for iterator_facade. Need more research. -JGS - typedef bogus difference_type; + struct bogus { }; // This used to be void, but that causes trouble for iterator_facade. Need more research. -JGS + using difference_type = bogus; - Derived& operator++() { return (Derived&)static_object::get(); } - Derived operator++(int) const { return (Derived&)static_object::get(); } - }; - }; + Derived& operator++() { return (Derived&)static_object::get(); } + Derived operator++(int) const { return (Derived&)static_object::get(); } + }; +}; - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public equality_comparable< traversal_archetype_ >, - public traversal_archetype_ - { - explicit archetype(ctor_arg arg) - : traversal_archetype_(arg) - {} +template <> +struct traversal_archetype_impl +{ + template + struct archetype : + public equality_comparable< traversal_archetype_ >, + public traversal_archetype_ + { + explicit archetype(ctor_arg arg) : + traversal_archetype_(arg) + {} - typedef std::ptrdiff_t difference_type; - }; - }; + using difference_type = std::ptrdiff_t; + }; +}; - template - bool operator==(traversal_archetype_ const&, - traversal_archetype_ const&) { return true; } +template +bool operator==( + traversal_archetype_ const&, + traversal_archetype_ const&) { return true; } - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - archetype() - : traversal_archetype_(ctor_arg()) - {} - }; - }; +template <> +struct traversal_archetype_impl +{ + template + struct archetype : + public traversal_archetype_ + { + archetype() : + traversal_archetype_(ctor_arg()) + {} + }; +}; - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - Derived& operator--() { return static_object::get(); } - Derived operator--(int) const { return static_object::get(); } - }; - }; +template <> +struct traversal_archetype_impl +{ + template + struct archetype : + public traversal_archetype_ + { + Derived& operator--() { return static_object::get(); } + Derived operator--(int) const { return static_object::get(); } + }; +}; - template <> - struct traversal_archetype_impl - { - template - struct archetype - : public traversal_archetype_ - { - Derived& operator+=(std::ptrdiff_t) { return static_object::get(); } - Derived& operator-=(std::ptrdiff_t) { return static_object::get(); } - }; - }; +template <> +struct traversal_archetype_impl +{ + template + struct archetype : + public traversal_archetype_ + { + Derived& operator+=(std::ptrdiff_t) { return static_object::get(); } + Derived& operator-=(std::ptrdiff_t) { return static_object::get(); } + }; +}; - template - Derived& operator+(traversal_archetype_ const&, - std::ptrdiff_t) { return static_object::get(); } +template +Derived& operator+( + traversal_archetype_ const&, + std::ptrdiff_t) { return static_object::get(); } - template - Derived& operator+(std::ptrdiff_t, - traversal_archetype_ const&) - { return static_object::get(); } +template +Derived& operator+( + std::ptrdiff_t, + traversal_archetype_ const&) + { return static_object::get(); } - template - Derived& operator-(traversal_archetype_ const&, - std::ptrdiff_t) - { return static_object::get(); } +template +Derived& operator-( + traversal_archetype_ const&, + std::ptrdiff_t) { return static_object::get(); } - template - std::ptrdiff_t operator-(traversal_archetype_ const&, - traversal_archetype_ const&) - { return 0; } +template +std::ptrdiff_t operator-( + traversal_archetype_ const&, + traversal_archetype_ const&) + { return 0; } - template - bool operator<(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } +template +bool operator<( + traversal_archetype_ const&, + traversal_archetype_ const&) + { return true; } - template - bool operator>(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } +template +bool operator>( + traversal_archetype_ const&, + traversal_archetype_ const&) + { return true; } - template - bool operator<=(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } +template +bool operator<=( + traversal_archetype_ const&, + traversal_archetype_ const&) + { return true; } - template - bool operator>=(traversal_archetype_ const&, - traversal_archetype_ const&) - { return true; } +template +bool operator>=( + traversal_archetype_ const&, + traversal_archetype_ const&) + { return true; } - struct bogus_type; +struct bogus_type; - template - struct convertible_type - : std::conditional< std::is_const::value, - typename std::remove_const::type, - bogus_type > - {}; +template +struct convertible_type +{ + using type = bogus_type; +}; + +template +struct convertible_type +{ + using type = Value; +}; } // namespace detail @@ -291,24 +285,20 @@ struct iterator_access_archetype_impl }; template -struct iterator_access_archetype - : iterator_access_archetype_impl< - AccessCategory - >::template archetype +struct iterator_access_archetype : + public iterator_access_archetype_impl::template archetype { }; template <> -struct iterator_access_archetype_impl< - archetypes::readable_iterator_t -> +struct iterator_access_archetype_impl { template struct archetype { - typedef typename std::remove_cv::type value_type; - typedef Value reference; - typedef Value* pointer; + using value_type = typename std::remove_cv::type; + using reference = Value; + using pointer = Value*; value_type operator*() const { return static_object::get(); } @@ -317,34 +307,28 @@ struct iterator_access_archetype_impl< }; template <> -struct iterator_access_archetype_impl< - archetypes::writable_iterator_t -> +struct iterator_access_archetype_impl { template struct archetype { static_assert(!std::is_const::value, "Value type must not be const."); - typedef void value_type; - typedef void reference; - typedef void pointer; + using value_type = void; + using reference = void; + using pointer = void; detail::assign_proxy operator*() const { return detail::assign_proxy(); } }; }; template <> -struct iterator_access_archetype_impl< - archetypes::readable_writable_iterator_t -> +struct iterator_access_archetype_impl { template - struct archetype - : public virtual iterator_access_archetype< - Value, archetypes::readable_iterator_t - > + struct archetype : + public virtual iterator_access_archetype { - typedef detail::read_write_proxy reference; + using reference = detail::read_write_proxy; detail::read_write_proxy operator*() const { return detail::read_write_proxy(); } }; @@ -354,12 +338,10 @@ template <> struct iterator_access_archetype_impl { template - struct archetype - : public virtual iterator_access_archetype< - Value, archetypes::readable_iterator_t - > + struct archetype : + public virtual iterator_access_archetype { - typedef Value& reference; + using reference = Value&; Value& operator*() const { return static_object::get(); } Value* operator->() const { return 0; } @@ -370,10 +352,8 @@ template <> struct iterator_access_archetype_impl { template - struct archetype - : public virtual iterator_access_archetype< - Value, archetypes::readable_lvalue_iterator_t - > + struct archetype : + public virtual iterator_access_archetype { static_assert(!std::is_const::value, "Value type must not be const."); }; @@ -384,58 +364,59 @@ template struct iterator_archetype; template -struct traversal_archetype_base - : detail::operator_brackets< - typename std::remove_cv::type - , AccessCategory - , TraversalCategory - > - , detail::traversal_archetype_< - iterator_archetype - , Value - , TraversalCategory +struct traversal_archetype_base : + public detail::operator_brackets< + typename std::remove_cv::type, + AccessCategory, + TraversalCategory + >, + public detail::traversal_archetype_< + iterator_archetype, + Value, + TraversalCategory > { }; -namespace detail -{ - template - struct iterator_archetype_base - : iterator_access_archetype - , traversal_archetype_base - { - typedef iterator_access_archetype access; - - typedef typename detail::facade_iterator_category< - TraversalCategory - , typename mpl::eval_if< - archetypes::has_access< - AccessCategory, archetypes::writable_iterator_t - > - , std::remove_const - , std::add_const - >::type - , typename access::reference - >::type iterator_category; - - // Needed for some broken libraries (see below) - struct workaround_iterator_base - { - typedef typename iterator_archetype_base::iterator_category iterator_category; - typedef Value value_type; - typedef typename traversal_archetype_base< - Value, AccessCategory, TraversalCategory - >::difference_type difference_type; - typedef typename access::pointer pointer; - typedef typename access::reference reference; - }; - }; -} +namespace detail { template -struct iterator_archetype - : public detail::iterator_archetype_base +struct iterator_archetype_base : + public iterator_access_archetype, + public traversal_archetype_base +{ + using access = iterator_access_archetype; + + using iterator_category = typename detail::facade_iterator_category< + TraversalCategory, + typename std::conditional< + archetypes::has_access< + AccessCategory, archetypes::writable_iterator_t + >::value, + std::remove_const, + std::add_const + >::type::type, + typename access::reference + >::type; + + // Needed for some broken libraries (see below) + struct workaround_iterator_base + { + using iterator_category = typename iterator_archetype_base::iterator_category; + using value_type = Value; + using difference_type = typename traversal_archetype_base< + Value, AccessCategory, TraversalCategory + >::difference_type; + using pointer = typename access::pointer; + using reference = typename access::reference; + }; +}; + +} // namespace detail + +template +struct iterator_archetype : + public detail::iterator_archetype_base // These broken libraries require derivation from std::iterator // (or related magic) in order to handle iter_swap and other @@ -453,28 +434,23 @@ struct iterator_archetype # if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 310) \ || BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(0x20101)) - typedef detail::iterator_archetype_base< - Value,AccessCategory,TraversalCategory - > base; + using base = detail::iterator_archetype_base< + Value, AccessCategory, TraversalCategory + >; - typedef typename base::value_type value_type; - typedef typename base::reference reference; - typedef typename base::pointer pointer; - typedef typename base::difference_type difference_type; - typedef typename base::iterator_category iterator_category; + using value_type = typename base::value_type; + using reference = typename base::reference; + using pointer = typename base::pointer; + using difference_type = typename base::difference_type; + using iterator_category = typename base::iterator_category; # endif iterator_archetype() { } - iterator_archetype(iterator_archetype const& x) - : detail::iterator_archetype_base< - Value - , AccessCategory - , TraversalCategory - >(x) + iterator_archetype(iterator_archetype const& x) : + detail::iterator_archetype_base(x) {} - iterator_archetype& operator=(iterator_archetype const&) - { return *this; } + iterator_archetype& operator=(iterator_archetype const&) { return *this; } # if 0 // Optional conversion from mutable