18 using Traits = std::char_traits<CharT>;
19 CharT
const* str_{
nullptr};
23 using value_type = CharT;
24 using iterator =
const CharT*;
25 using const_iterator = iterator;
26 using reverse_iterator = std::reverse_iterator<const_iterator>;
27 using const_reverse_iterator = reverse_iterator;
31 constexpr StringView(CharT
const* str, std::size_t size) : str_{str}, size_{size} {}
32 explicit StringView(std::string
const& str) : str_{str.c_str()}, size_{str.size()} {}
34 : str_{str}, size_{str ==
nullptr ? 0ul : Traits::length(str)} {}
36 CharT
const& operator[](
size_t p)
const {
return str_[p]; }
37 CharT
const& at(
size_t p)
const {
41 constexpr std::size_t size()
const {
return size_; }
42 constexpr bool empty()
const {
return size() == 0; }
43 StringView substr(
size_t beg,
size_t n)
const {
45 size_t len = std::min(n, size_ - beg);
46 return {str_ + beg, len};
48 CharT
const* c_str()
const {
return str_; }
50 constexpr CharT
const* cbegin()
const {
return str_; }
51 constexpr CharT
const* cend()
const {
return str_ + size(); }
52 constexpr CharT
const* begin()
const {
return str_; }
53 constexpr CharT
const* end()
const {
return str_ + size(); }
55 const_reverse_iterator rbegin()
const noexcept {
56 return const_reverse_iterator(this->end());
58 const_reverse_iterator crbegin()
const noexcept {
59 return const_reverse_iterator(this->end());
61 const_reverse_iterator rend()
const noexcept {
62 return const_reverse_iterator(this->begin());
64 const_reverse_iterator crend()
const noexcept {
65 return const_reverse_iterator(this->begin());