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 {}; struct is_range_adapter_type<std::basic_string_view<CharT, Traits>> : std::true_type {};
template<typename T> 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<std::tuple<int, int>>::value);
static_assert(is_range_adapter_type<RangeAdapter>::value); static_assert(is_range_adapter_type<RangeAdapter>::value);
@ -51,7 +51,7 @@ static_assert(is_range_adapter_type<RangeAdapter>::value);
template<RangeAdapterType T> template<RangeAdapterType T>
struct RangeRef<T> struct RangeRef<T>
{ {
T range; std::remove_reference_t<T> range;
decltype(auto) begin() const decltype(auto) begin() const
{ {
@ -399,6 +399,26 @@ auto operator|(TIterable&& iterable, Collect<T>)
{ {
return collect<T>(std::forward<TIterable>(iterable)); 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 } // namespace mijin