33namespace essence::detail {
40 template <std::ranges::range Range>
41 consteval auto get_range_value_t_or_self() noexcept {
42 return std::type_identity<std::ranges::range_value_t<Range>>{};
52 consteval auto get_range_value_t_or_self() noexcept {
53 return std::type_identity<T>{};
63 requires std::ranges::contiguous_range<T>;
76 using type =
typename decltype(detail::get_range_value_t_or_self<T>())::type;
84 using range_value_t_or_self_t =
typename range_value_t_or_self<T>::type;
86 template <
byte_like_contiguous_range Range>
87 constexpr auto as_const_byte_span(Range&& range)
noexcept {
89 if constexpr (std::convertible_to<Range, std::string_view>) {
90 const std::string_view view{range};
92 return std::span{
reinterpret_cast<const std::byte*
>(view.data()), view.size()};
94 }
else if constexpr (std::convertible_to<Range, std::u8string_view>) {
95 const std::u8string_view view{range};
97 return std::span{
reinterpret_cast<const std::byte*
>(view.data()), view.size()};
99 return std::span{
reinterpret_cast<const std::byte*
>(std::ranges::cdata(range)),
100 std::ranges::size(range) *
sizeof(std::ranges::range_value_t<Range>)};
112 template <std::ranges::forward_range Range, std::ranges::forward_range Delimiter>
113 requires(std::ranges::contiguous_range<std::ranges::range_value_t<Range>>
114 && std::ranges::contiguous_range<Delimiter>)
115 constexpr auto join_with(Range&& range, Delimiter&& delimiter) {
117 std::array<std::span<const std::ranges::range_value_t<std::ranges::range_value_t<Range>>>, 2>;
121 cache.back() = std::span{std::ranges::data(delimiter), std::ranges::size(delimiter)};
123 auto adapter = range | std::views::transform([cache](
const auto& inner)
mutable {
124 cache.front() = std::span{std::ranges::data(inner), std::ranges::size(inner)};
126 return cache | std::views::join;
127 }) | std::views::join;
129 auto size = std::ranges::distance(adapter);
131 return adapter | std::views::take(size == 0 ? 0 : size - 1) | std::views::common;
Gets the type of range value, or the type itself if the type is non-ranged.
Definition range.hpp:75