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];
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()};
153 if (
int cmp{std::strncmp(begin(), that, bytes)}) {
156 return that[bytes] ==
'\0' ? 0 : -1;
162inline bool operator<(
const char *left,
const CharBlock &right) {
165inline bool operator<=(
const char *left,
const CharBlock &right) {
166 return right >= left;
168inline bool operator==(
const char *left,
const CharBlock &right) {
169 return right == left;
171inline bool operator!=(
const char *left,
const CharBlock &right) {
172 return right != left;
174inline bool operator>=(
const char *left,
const CharBlock &right) {
175 return right <= left;
177inline bool operator>(
const char *left,
const CharBlock &right) {
184 return x.end() < y.begin();
188llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
const CharBlock &x);
193template <>
struct std::hash<
Fortran::parser::CharBlock> {
195 std::size_t hash{0}, bytes{x.size()};
196 for (std::size_t j{0}; j < bytes; ++j) {
197 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:182