Reduced dependency on MPL in minimum_category.hpp.

This commit is contained in:
Andrey Semashev 2025-01-26 19:27:30 +03:00
parent 7ddbf15868
commit b30cbf634c

View File

@ -2,61 +2,35 @@
// subject to the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
# define BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
#define BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_
# include <type_traits>
# include <boost/mpl/placeholders.hpp>
# include <boost/mpl/aux_/lambda_support.hpp>
#include <type_traits>
#include <boost/mpl/arg_fwd.hpp>
namespace boost {
namespace iterators {
namespace detail {
template <bool GreaterEqual, bool LessEqual>
template <class T1, class T2, bool GreaterEqual, bool LessEqual>
struct minimum_category_impl;
template <class T1, class T2>
struct error_not_related_by_convertibility;
template <>
struct minimum_category_impl<true,false>
struct minimum_category_impl<T1, T2, true, false>
{
template <class T1, class T2> struct apply
{
typedef T2 type;
};
using type = T2;
};
template <>
struct minimum_category_impl<false,true>
template <class T1, class T2>
struct minimum_category_impl<T1, T2, false, true>
{
template <class T1, class T2> struct apply
{
typedef T1 type;
};
using type = T1;
};
template <>
struct minimum_category_impl<true,true>
template <class T1, class T2>
struct minimum_category_impl<T1, T2, true, true>
{
template <class T1, class T2> struct apply
{
static_assert(
std::is_same<T1,T2>::value,
"Iterator category types must be the same when they are equivalent."
);
typedef T1 type;
};
};
template <>
struct minimum_category_impl<false,false>
{
template <class T1, class T2> struct apply
: error_not_related_by_convertibility<T1,T2>
{
};
static_assert(std::is_same<T1, T2>::value, "Iterator category types must be the same when they are equivalent.");
using type = T1;
};
} // namespace detail
@ -65,32 +39,30 @@ struct minimum_category_impl<false,false>
// Returns the minimum category type or fails to compile
// if T1 and T2 are unrelated.
//
template <class T1 = mpl::_1, class T2 = mpl::_2>
template< class T1 = mpl::arg<1>, class T2 = mpl::arg<2> >
struct minimum_category
{
typedef boost::iterators::detail::minimum_category_impl<
std::is_convertible<T1,T2>::value
, std::is_convertible<T2,T1>::value
> outer;
static_assert(
std::is_convertible<T1, T2>::value || std::is_convertible<T2, T1>::value,
"Iterator category types must be related through convertibility.");
typedef typename outer::template apply<T1,T2> inner;
typedef typename inner::type type;
BOOST_MPL_AUX_LAMBDA_SUPPORT(2,minimum_category,(T1,T2))
using type = typename boost::iterators::detail::minimum_category_impl<
T1,
T2,
std::is_convertible<T1, T2>::value,
std::is_convertible<T2, T1>::value
>::type;
};
template <>
struct minimum_category<mpl::_1,mpl::_2>
struct minimum_category< mpl::arg<1>, mpl::arg<2> >
{
template <class T1, class T2>
struct apply : minimum_category<T1,T2>
struct apply : minimum_category<T1, T2>
{};
BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,minimum_category,(mpl::_1,mpl::_2))
};
} // namespace iterators
} // namespace boost
#endif // BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_