simplify range traits tests

This commit is contained in:
q66 2016-01-14 19:15:50 +00:00
parent 8152173c39
commit f578bd71f6

View file

@ -71,11 +71,8 @@ namespace detail {
// is input range // is input range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible<RangeCategory<T>, InputRangeTag>> template<typename T> constexpr bool IsInputRangeCore
constexpr bool IsInputRangeCore = false; = IsConvertible<RangeCategory<T>, InputRangeTag>;
template<typename T>
constexpr bool IsInputRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsInputRangeBase = false; constexpr bool IsInputRangeBase = false;
@ -90,11 +87,8 @@ constexpr bool IsInputRange = detail::IsInputRangeBase<T>;
// is forward range // is forward range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible<RangeCategory<T>, ForwardRangeTag>> template<typename T> constexpr bool IsForwardRangeCore
constexpr bool IsForwardRangeCore = false; = IsConvertible<RangeCategory<T>, ForwardRangeTag>;
template<typename T>
constexpr bool IsForwardRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsForwardRangeBase = false; constexpr bool IsForwardRangeBase = false;
@ -109,12 +103,8 @@ constexpr bool IsForwardRange = detail::IsForwardRangeBase<T>;
// is bidirectional range // is bidirectional range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible< template<typename T> constexpr bool IsBidirectionalRangeCore
RangeCategory<T>, BidirectionalRangeTag = IsConvertible<RangeCategory<T>, BidirectionalRangeTag>;
>> constexpr bool IsBidirectionalRangeCore = false;
template<typename T>
constexpr bool IsBidirectionalRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsBidirectionalRangeBase = false; constexpr bool IsBidirectionalRangeBase = false;
@ -130,12 +120,8 @@ template<typename T> constexpr bool IsBidirectionalRange
// is random access range // is random access range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible< template<typename T> constexpr bool IsRandomAccessRangeCore
RangeCategory<T>, RandomAccessRangeTag = IsConvertible<RangeCategory<T>, RandomAccessRangeTag>;
>> constexpr bool IsRandomAccessRangeCore = false;
template<typename T>
constexpr bool IsRandomAccessRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsRandomAccessRangeBase = false; constexpr bool IsRandomAccessRangeBase = false;
@ -151,12 +137,8 @@ template<typename T> constexpr bool IsRandomAccessRange
// is finite random access range // is finite random access range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible< template<typename T> constexpr bool IsFiniteRandomAccessRangeCore
RangeCategory<T>, FiniteRandomAccessRangeTag = IsConvertible<RangeCategory<T>, FiniteRandomAccessRangeTag>;
>> constexpr bool IsFiniteRandomAccessRangeCore = false;
template<typename T>
constexpr bool IsFiniteRandomAccessRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsFiniteRandomAccessRangeBase = false; constexpr bool IsFiniteRandomAccessRangeBase = false;
@ -177,12 +159,8 @@ template<typename T> constexpr bool IsInfiniteRandomAccessRange
// is contiguous range // is contiguous range
namespace detail { namespace detail {
template<typename T, bool = IsConvertible< template<typename T> constexpr bool IsContiguousRangeCore
RangeCategory<T>, ContiguousRangeTag = IsConvertible<RangeCategory<T>, ContiguousRangeTag>;
>> constexpr bool IsContiguousRangeCore = false;
template<typename T>
constexpr bool IsContiguousRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsContiguousRangeBase = false; constexpr bool IsContiguousRangeBase = false;
@ -206,16 +184,12 @@ namespace detail {
static constexpr bool value = (sizeof(test<T>(0)) == sizeof(char)); static constexpr bool value = (sizeof(test<T>(0)) == sizeof(char));
}; };
template<typename T, bool = (IsConvertible< template<typename T> constexpr bool IsOutputRangeCore
RangeCategory<T>, OutputRangeTag = IsConvertible<RangeCategory<T>, OutputRangeTag> ||
> || (IsInputRange<T> && (IsInputRange<T> &&
(detail::OutputRangeTest<T, const RangeValue<T> &>::value || (detail::OutputRangeTest<T, const RangeValue<T> &>::value ||
detail::OutputRangeTest<T, RangeValue<T> &&>::value || detail::OutputRangeTest<T, RangeValue<T> &&>::value ||
detail::OutputRangeTest<T, RangeValue<T> >::value) detail::OutputRangeTest<T, RangeValue<T> >::value));
))> constexpr bool IsOutputRangeCore = false;
template<typename T>
constexpr bool IsOutputRangeCore<T, true> = true;
template<typename T, bool = detail::IsRangeTest<T>::value> template<typename T, bool = detail::IsRangeTest<T>::value>
constexpr bool IsOutputRangeBase = false; constexpr bool IsOutputRangeBase = false;