Skip to content

Commit

Permalink
Fix over-eager value_type fix
Browse files Browse the repository at this point in the history
  • Loading branch information
jfalcou committed Nov 26, 2022
1 parent 5efe747 commit 2e9387f
Showing 1 changed file with 20 additions and 17 deletions.
37 changes: 20 additions & 17 deletions include/eve/traits/value_type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,36 @@ namespace eve
{
namespace detail
{
template<range T> constexpr auto value_type_impl()
template<range T>
constexpr auto value_type_impl()
{
using ref = std::add_lvalue_reference_t<T>;
return value_type_impl<decltype(begin(std::declval<ref>()))>();
}

template<std::input_or_output_iterator T> constexpr auto value_type_impl()
template<std::input_or_output_iterator T>
constexpr auto value_type_impl()
{
return std::type_identity<typename std::iterator_traits<T>::value_type>{};
}

// Maybe this should be deleted
template<kumi::product_type T> constexpr auto value_type_impl()
template <typename T>
constexpr auto value_type_impl()
{
auto mapper = []<typename U>(U)
if constexpr ( requires { typename T::value_type; } )
{
return typename decltype(value_type_impl<U>())::type{};
};

return std::type_identity<kumi::result::map_t<decltype(mapper), T>>{};
}
return std::type_identity<typename T::value_type>{};
}
// Maybe this should be deleted
else if constexpr ( kumi::product_type<T> )
{
auto mapper = []<typename U>(U)
{
return typename decltype( value_type_impl<U>() )::type{};
};

template<typename T>
requires requires { typename T::value_type; }
constexpr auto value_type_impl()
{
return std::type_identity<typename T::value_type>{};
return std::type_identity<kumi::result::map_t<decltype(mapper), T>>{};
}
}
}

Expand All @@ -70,7 +73,7 @@ namespace eve
//! @}
//================================================================================================

template<typename T>
requires (!value<T>)
template <typename T>
requires (!value<T>)
using value_type_t = typename decltype(detail::value_type_impl<T>())::type;
}

0 comments on commit 2e9387f

Please sign in to comment.