9#ifndef FORTRAN_PARSER_CHAR_BLOCK_H_
10#define FORTRAN_PARSER_CHAR_BLOCK_H_
14#include "flang/Common/interval.h"
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()} {}
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;
169inline bool operator<(
const char *left,
const CharBlock &right) {
172inline bool operator<=(
const char *left,
const CharBlock &right) {
173 return right >= left;
175inline bool operator==(
const char *left,
const CharBlock &right) {
176 return right == left;
178inline bool operator!=(
const char *left,
const CharBlock &right) {
179 return right != left;
181inline bool operator>=(
const char *left,
const CharBlock &right) {
182 return right <= left;
184inline bool operator>(
const char *left,
const CharBlock &right) {
191 return x.end() < y.begin();
195llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
const CharBlock &x);
200template <>
struct std::hash<
Fortran::parser::CharBlock> {
202 std::size_t hash{0}, bytes{x.size()};
203 for (std::size_t j{0}; j < bytes; ++j) {
204 hash = (hash * 31) ^ x[j];
Definition: interval.h:22
Definition: char-block.h:28
Definition: check-expression.h:19
Definition: bit-population-count.h:20
Definition: char-block.h:189