diff --git a/ostd/string.hh b/ostd/string.hh index 0d19017..fd0fd11 100644 --- a/ostd/string.hh +++ b/ostd/string.hh @@ -31,37 +31,34 @@ struct basic_char_range: input_range> { using difference_type = ptrdiff_t; private: - struct Nat {}; + struct nat {}; public: basic_char_range(): p_beg(nullptr), p_end(nullptr) {}; basic_char_range(T *beg, T *end): p_beg(beg), p_end(end) {} - - template - basic_char_range( - U beg, std::enable_if_t< - std::is_convertible_v && !std::is_array_v, Nat - > = Nat() - ): p_beg(beg), p_end(static_cast(beg) + (beg ? TR::length(beg) : 0)) {} - basic_char_range(std::nullptr_t): p_beg(nullptr), p_end(nullptr) {} - template - basic_char_range(U (&beg)[N], std::enable_if_t< - std::is_convertible_v, Nat - > = Nat()): - p_beg(beg), p_end(beg + N - (beg[N - 1] == '\0')) - {} + template + basic_char_range(U &&beg, std::enable_if_t< + std::is_convertible_v, nat + > = nat{}): p_beg(beg) { + if constexpr(std::is_array_v>) { + size_t N = std::extent_v>; + p_end = beg + N - (beg[N - 1] == '\0'); + } else { + p_end = beg + (beg ? TR::length(beg) : 0); + } + } template basic_char_range(std::basic_string, STR, A> const &s): p_beg(s.data()), p_end(s.data() + s.size()) {} - template >> - basic_char_range(basic_char_range const &v): + basic_char_range(basic_char_range const &v): p_beg(&v[0]), p_end(&v[v.size()]) {}