28 constexpr CharBlock() {}
29 constexpr CharBlock(
const char *x, std::size_t n = 1) : interval_{x, n} {}
30 constexpr CharBlock(
const char *b,
const char *ep1)
31 : interval_{b,
static_cast<std::size_t
>(ep1 - b)} {}
32 CharBlock(
const std::string &s) : interval_{s.data(), s.size()} {}
33 constexpr CharBlock(
const CharBlock &) =
default;
34 constexpr CharBlock(CharBlock &&) =
default;
35 constexpr CharBlock &operator=(
const CharBlock &) =
default;
36 constexpr CharBlock &operator=(CharBlock &&) =
default;
38 constexpr bool empty()
const {
return interval_.empty(); }
39 constexpr std::size_t size()
const {
return interval_.size(); }
40 constexpr const char *begin()
const {
return interval_.start(); }
41 constexpr const char *end()
const {
42 return interval_.start() + interval_.size();
44 constexpr const char &operator[](std::size_t j)
const {
45 return interval_.start()[j];
47 constexpr const char &front()
const {
return (*
this)[0]; }
48 constexpr const char &back()
const {
return (*
this)[size() - 1]; }
50 bool Contains(
const CharBlock &that)
const {
51 return interval_.Contains(that.interval_);
54 void ExtendToCover(
const CharBlock &that) {
55 interval_.ExtendToCover(that.interval_);
60 char FirstNonBlank()
const {
61 for (
char ch : *
this) {
62 if (ch !=
' ' && ch !=
'\t') {
71 char OnlyNonBlank()
const {
73 for (
char ch : *
this) {
74 if (ch !=
' ' && ch !=
'\t') {
85 std::size_t CountLeadingBlanks()
const {
86 std::size_t n{size()};
90 if (ch !=
' ' && ch !=
'\t') {
97 bool IsBlank()
const {
return FirstNonBlank() ==
' '; }
99 std::string ToString()
const {
100 return std::string{interval_.start(), interval_.size()};
104 std::string NULTerminatedToString()
const {
105 return std::string{interval_.start(),
106 strnlen(interval_.start(), interval_.size())};
109 bool operator<(
const CharBlock &that)
const {
return Compare(that) < 0; }
110 bool operator<=(
const CharBlock &that)
const {
return Compare(that) <= 0; }
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; }
116 bool operator<(
const char *that)
const {
return Compare(that) < 0; }
117 bool operator<=(
const char *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; }
123 friend bool operator<(
const char *,
const CharBlock &);
124 friend bool operator<=(
const char *,
const CharBlock &);
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 &);
131 int Compare(
const CharBlock &that)
const {
136 return that.size() == 0 ? 0 : -1;
137 }
else if (that.size() == 0) {
140 std::size_t bytes{std::min(size(), that.size())};
141 int cmp{std::memcmp(
static_cast<const void *
>(begin()),
142 static_cast<const void *
>(that.begin()), bytes)};
146 return size() < that.size() ? -1 : size() > that.size();
151 int Compare(
const char *that)
const {
152 std::size_t bytes{size()};
155 return that ==
nullptr ? 0 : -1;
158 }
else if (
int cmp{std::strncmp(begin(), that, bytes)}) {
161 return that[bytes] ==
'\0' ? 0 : -1;