30 constexpr CharBlock() {}
31 constexpr CharBlock(
const char *x, std::size_t n = 1) : interval_{x, n} {}
32 constexpr CharBlock(
const char *b,
const char *ep1)
33 : interval_{b,
static_cast<std::size_t
>(ep1 - b)} {}
34 CharBlock(
const std::string &s) : interval_{s.data(), s.size()} {}
35 constexpr CharBlock(
const CharBlock &) =
default;
36 constexpr CharBlock(CharBlock &&) =
default;
37 constexpr CharBlock &operator=(
const CharBlock &) =
default;
38 constexpr CharBlock &operator=(CharBlock &&) =
default;
40 constexpr bool empty()
const {
return interval_.empty(); }
41 constexpr std::size_t size()
const {
return interval_.size(); }
42 constexpr const char *begin()
const {
return interval_.start(); }
43 constexpr const char *end()
const {
44 return interval_.start() + interval_.size();
46 constexpr const char &operator[](std::size_t j)
const {
47 return interval_.start()[j];
49 constexpr const char &front()
const {
return (*
this)[0]; }
50 constexpr const char &back()
const {
return (*
this)[size() - 1]; }
52 bool Contains(
const CharBlock &that)
const {
53 return interval_.Contains(that.interval_);
56 void ExtendToCover(
const CharBlock &that) {
57 interval_.ExtendToCover(that.interval_);
62 char FirstNonBlank()
const {
63 for (
char ch : *
this) {
64 if (ch !=
' ' && ch !=
'\t') {
73 char OnlyNonBlank()
const {
75 for (
char ch : *
this) {
76 if (ch !=
' ' && ch !=
'\t') {
87 std::size_t CountLeadingBlanks()
const {
88 std::size_t n{size()};
92 if (ch !=
' ' && ch !=
'\t') {
99 bool IsBlank()
const {
return FirstNonBlank() ==
' '; }
101 std::string ToString()
const {
102 return std::string{interval_.start(), interval_.size()};
106 std::string NULTerminatedToString()
const {
107 return std::string{interval_.start(),
108 strnlen(interval_.start(), interval_.size())};
111 bool operator<(
const CharBlock &that)
const {
return Compare(that) < 0; }
112 bool operator<=(
const CharBlock &that)
const {
return Compare(that) <= 0; }
113 bool operator==(
const CharBlock &that)
const {
return Compare(that) == 0; }
114 bool operator!=(
const CharBlock &that)
const {
return Compare(that) != 0; }
115 bool operator>=(
const CharBlock &that)
const {
return Compare(that) >= 0; }
116 bool operator>(
const CharBlock &that)
const {
return Compare(that) > 0; }
118 bool operator<(
const char *that)
const {
return Compare(that) < 0; }
119 bool operator<=(
const char *that)
const {
return Compare(that) <= 0; }
120 bool operator==(
const char *that)
const {
return Compare(that) == 0; }
121 bool operator!=(
const char *that)
const {
return Compare(that) != 0; }
122 bool operator>=(
const char *that)
const {
return Compare(that) >= 0; }
123 bool operator>(
const char *that)
const {
return Compare(that) > 0; }
125 friend bool operator<(
const char *,
const CharBlock &);
126 friend bool operator<=(
const char *,
const CharBlock &);
127 friend bool operator==(
const char *,
const CharBlock &);
128 friend bool operator!=(
const char *,
const CharBlock &);
129 friend bool operator>=(
const char *,
const CharBlock &);
130 friend bool operator>(
const char *,
const CharBlock &);
133 int Compare(
const CharBlock &that)
const {
138 return that.size() == 0 ? 0 : -1;
139 }
else if (that.size() == 0) {
142 std::size_t bytes{std::min(size(), that.size())};
143 int cmp{std::memcmp(
static_cast<const void *
>(begin()),
144 static_cast<const void *
>(that.begin()), bytes)};
148 return size() < that.size() ? -1 : size() > that.size();
153 int Compare(
const char *that)
const {
154 std::size_t bytes{size()};
157 return that ==
nullptr ? 0 : -1;
160 }
else if (
int cmp{std::strncmp(begin(), that, bytes)}) {
163 return that[bytes] ==
'\0' ? 0 : -1;