30template <
class TargetT,
typename SourceT>
31[[nodiscard]]
constexpr inline auto rangeTo(SourceT&& sourceRange)
33#if defined(__cpp_lib_ranges_to_container)
34 return std::ranges::to<TargetT>(std::forward<SourceT>(sourceRange));
37 using namespace std::ranges;
38 if constexpr (std::constructible_from<TargetT, SourceT>)
39 return TargetT(std::forward<SourceT>(sourceRange));
41 using iter_t = iterator_t<SourceT>;
42 using iter_category_t =
typename std::iterator_traits<iter_t>::iterator_category;
43 if constexpr (requires {
44 requires common_range<SourceT>;
45 typename iter_category_t;
46 requires std::derived_from<iter_category_t, std::input_iterator_tag>;
47 requires std::constructible_from<TargetT, iter_t, sentinel_t<SourceT>>;
49 return TargetT(begin(sourceRange), end(sourceRange));
52 if constexpr (sized_range<SourceT>
53 && requires(range_size_t<TargetT> n) { c.reserve(n); })
54 c.reserve(
static_cast<range_size_t<TargetT>>(size(sourceRange)));
55 using ValT = std::iter_value_t<iter_t>;
56 for (
auto&& e : sourceRange) {
57 if constexpr (requires { c.emplace_back(std::forward<ValT>(e)); })
58 c.emplace_back(std::forward<ValT>(e));
59 else if constexpr (requires { c.push_back(std::forward<ValT>(e)); })
60 c.push_back(std::forward<ValT>(e));
61 else if constexpr (requires { c.emplace(c.end(), std::forward<ValT>(e)); })
62 c.emplace(c.end(), std::forward<ValT>(e));
64 c.insert(c.end(), std::forward<ValT>(e));
73template <
template <
typename>
class TargetT,
typename SourceT>
74[[nodiscard]]
constexpr inline auto rangeTo(SourceT&& sourceRange)
77#if defined(__cpp_lib_ranges_to_container)
78 return std::ranges::to<TargetT<std::ranges::range_value_t<SourceT>>>(
79 std::forward<SourceT>(sourceRange));
81 return rangeTo<TargetT<std::ranges::range_value_t<SourceT>>>(std::forward<SourceT>(sourceRange));
85#ifdef __cpp_lib_ranges_contains
90 return std::ranges::find(c, v, std::move(proj)) != std::ranges::end(c);
constexpr auto rangeContains(const auto &c, const auto &v, auto proj)
constexpr auto rangeTo(SourceT &&sourceRange)
A replacement of std::ranges::to() while toolchains catch up.