diff --git a/include/dwarfs/conv.h b/include/dwarfs/conv.h index 2e74a438..43f428c6 100644 --- a/include/dwarfs/conv.h +++ b/include/dwarfs/conv.h @@ -77,7 +77,11 @@ std::optional tryTo(U&& s) template T to(U&& s) { - return tryTo(std::forward(s)).value(); + if constexpr (std::same_as>) { + return std::forward(s); + } else { + return tryTo(std::forward(s)).value(); + } } } // namespace dwarfs diff --git a/include/dwarfs/string.h b/include/dwarfs/string.h index 1ceb7552..9f454634 100644 --- a/include/dwarfs/string.h +++ b/include/dwarfs/string.h @@ -21,6 +21,7 @@ #pragma once +#include #include #include #include @@ -30,10 +31,14 @@ #include #include +#include + namespace dwarfs { template -auto split_view(Input&& input, Delim&& delim) { +auto split_view(Input&& input, Delim&& delim) + requires(std::same_as || std::same_as) +{ return std::forward(input) | ranges::views::split(std::forward(delim)) | ranges::views::transform([](auto&& rng) { @@ -41,6 +46,17 @@ auto split_view(Input&& input, Delim&& delim) { }); } +template +auto split_view(Input&& input, Delim&& delim) + requires std::is_arithmetic_v +{ + return std::forward(input) | + ranges::views::split(std::forward(delim)) | + ranges::views::transform([](auto&& rng) { + return to(std::string_view(&*rng.begin(), ranges::distance(rng))); + }); +} + template auto split_view(char const* input, Delim&& delim) { return split_view(std::string_view(input), std::forward(delim));