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:
parent
adff35a26a
commit
3910f9638e
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user