Added Chain() type to chain iterables using pipes. Also fixed crash due to RangeRef actually storing a reference when it shouldn't.

This commit is contained in:
Patrick 2023-07-13 00:03:45 +02:00
parent adff35a26a
commit 3910f9638e

View File

@ -43,7 +43,7 @@ template<typename CharT, typename Traits>
struct is_range_adapter_type<std::basic_string_view<CharT, Traits>> : std::true_type {};
template<typename T>
concept RangeAdapterType = is_range_adapter_type<T>::value;
concept RangeAdapterType = is_range_adapter_type<std::decay_t<T>>::value;
static_assert(!is_range_adapter_type<std::tuple<int, int>>::value);
static_assert(is_range_adapter_type<RangeAdapter>::value);
@ -51,7 +51,7 @@ static_assert(is_range_adapter_type<RangeAdapter>::value);
template<RangeAdapterType T>
struct RangeRef<T>
{
T range;
std::remove_reference_t<T> range;
decltype(auto) begin() const
{
@ -399,6 +399,26 @@ auto operator|(TIterable&& iterable, Collect<T>)
{
return collect<T>(std::forward<TIterable>(iterable));
}
struct Chain {};
template<typename TIterable>
struct Chain2
{
RangeRef<TIterable> range;
};
template<typename TIterable>
auto operator|(TIterable&& iterable, Chain)
{
return Chain2<TIterable>{.range = {.range = std::forward<TIterable>(iterable)}};
}
template<typename TFirstIterable, typename TSecondIterable>
auto operator|(Chain2<TFirstIterable> chain2, TSecondIterable&& secondIterable)
{
return chain(chain2.range.range, std::forward<TSecondIterable>(secondIterable));
}
}
} // namespace mijin