14template <
typename RangeT,
typename ValT,
typename ProjT = std::identity>
31template <
class TargetT,
typename SourceT>
32[[nodiscard]]
constexpr inline auto rangeTo(SourceT&& sourceRange)
34#if defined(__cpp_lib_ranges_to_container)
35 return std::ranges::to<TargetT>(std::forward<SourceT>(sourceRange));
38 using namespace std::ranges;
39 if constexpr (std::constructible_from<TargetT, SourceT>)
40 return TargetT(std::forward<SourceT>(sourceRange));
42 using iter_t = iterator_t<SourceT>;
43 using iter_category_t =
typename std::iterator_traits<iter_t>::iterator_category;
44 if constexpr (requires {
45 requires common_range<SourceT>;
46 typename iter_category_t;
47 requires std::derived_from<iter_category_t, std::input_iterator_tag>;
48 requires std::constructible_from<TargetT, iter_t, sentinel_t<SourceT>>;
50 return TargetT(begin(sourceRange), end(sourceRange));
53 if constexpr (sized_range<SourceT>
54 && requires(range_size_t<TargetT> n) { c.reserve(n); })
55 c.reserve(
static_cast<range_size_t<TargetT>>(size(sourceRange)));
56 using ValT = std::iter_value_t<iter_t>;
57 for (
auto&& e : sourceRange) {
58 if constexpr (requires { c.emplace_back(std::forward<ValT>(e)); })
59 c.emplace_back(std::forward<ValT>(e));
60 else if constexpr (requires { c.push_back(std::forward<ValT>(e)); })
61 c.push_back(std::forward<ValT>(e));
62 else if constexpr (requires { c.emplace(c.end(), std::forward<ValT>(e)); })
63 c.emplace(c.end(), std::forward<ValT>(e));
65 c.insert(c.end(), std::forward<ValT>(e));
74template <
template <
typename>
class TargetT,
typename SourceT>
75[[nodiscard]]
constexpr inline auto rangeTo(SourceT&& sourceRange)
78#if defined(__cpp_lib_ranges_to_container)
79 return std::ranges::to<TargetT<std::ranges::range_value_t<SourceT>>>(
80 std::forward<SourceT>(sourceRange));
82 return rangeTo<TargetT<std::ranges::range_value_t<SourceT>>>(std::forward<SourceT>(sourceRange));
86#ifdef __cpp_lib_ranges_contains
91 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.