34struct [[deprecated(
"Use std::string_view instead")]] StringRef {
37 StringRef() : p(0), len(0) {}
38 StringRef(
const char *str,
size_t l) : p(str), len(l) {}
39 StringRef(
const char *str) : p(str), len(str ? strlen(str) : 0) {}
40 StringRef(
const std::string &str) : p(str.data()), len(str.size()) {}
41 StringRef(
cstring str) : p(str.c_str()), len(str.size()) {}
46 StringRef(
const StringRef &a) : p(a.p), len(a.len) {}
49 StringRef &operator=(
const StringRef &a) {
55 explicit operator bool()
const {
return p != 0; }
57 bool operator==(
const StringRef &a)
const {
58 return p ? (a.p && len == a.len && (!len || !memcmp(p, a.p, len))) : !a.p;
60 bool operator!=(
const StringRef &a)
const {
return !operator==(a); }
61 bool operator==(
const std::string &a)
const {
return operator==(StringRef(a)); }
62 bool operator==(
const char *a)
const {
63 return p ? (a && (!len || !strncmp(p, a, len)) && !a[len]) : !a;
65 bool operator==(
cstring a)
const {
return operator==(a.c_str()); }
67 bool operator!=(T a)
const {
70 bool isNullOrEmpty()
const {
return p == 0 || len == 0; }
72 int compare(
const StringRef &a)
const {
73 if (!p)
return a.p ? -1 : 0;
75 int rv = memcmp(p, a.p, std::min(len, a.len));
76 if (!rv && len != a.len) rv = len < a.len ? -1 : 1;
79 int compare(
const std::string &a)
const {
return compare(StringRef(a)); }
80 int compare(
const char *a)
const {
81 if (!p)
return a ? -1 : 0;
83 int rv = strncmp(p, a, len);
84 if (!rv && a[len]) rv = -1;
87 int compare(
cstring a)
const {
return compare(a.c_str()); }
89 bool operator<(T a)
const {
90 return compare(a) < 0;
93 bool operator<=(T a)
const {
94 return compare(a) <= 0;
97 bool operator>(T a)
const {
98 return compare(a) > 0;
101 bool operator>=(T a)
const {
102 return compare(a) >= 0;
105 explicit operator std::string()
const {
return std::string(p, len); }
106 operator cstring()
const {
return std::string(p, len); }
107 cstring toString()
const {
return std::string(p, len); }
108 std::string string()
const {
return std::string(p, len); }
109 StringRef &operator+=(
size_t i) {
119 StringRef &operator++() {
127 StringRef operator++(
int) {
132 StringRef &operator--() {
139 StringRef operator--(
int) {
144 char operator[](
size_t i)
const {
return i < len ? p[i] : 0; }
145 char operator*()
const {
return len ? *p : 0; }
146 StringRef operator+(
size_t i)
const {
151 StringRef &trim(
const char *white =
" \t\r\n") {
152 while (len > 0 && strchr(white, *p)) {
156 while (len > 0 && strchr(white, p[len - 1])) {
163 while (len > 0 && p[len - 1] ==
'\r') {
169 StringRef trim(
const char *white =
" \t\r\n")
const {
174 const char *begin()
const {
return p; }
175 const char *end()
const {
return p + len; }
176 const char *find(
char ch)
const {
177 return p ?
static_cast<const char *
>(memchr(p, ch, len)) : p;
179 const char *findlast(
char ch)
const {
180 return p ?
static_cast<const char *
>(memrchr(p, ch, len)) : p;
182 const char *find(
const char *set)
const {
184 size_t off = strcspn(p, set);
185 return off >= len ? 0 : p + off;
187 const char *findstr(StringRef sub) {
188 if (sub.len < 1)
return p;
189 const char *s = begin(), *e = end();
190 while (s < e && (s =
static_cast<const char *
>(memchr(s, *sub.p, e - s)))) {
191 if (sub.len > (
size_t)(e - s))
return nullptr;
192 if (!memcmp(s, sub.p, sub.len))
return s;
197 StringRef before(
const char *s)
const {
198 return (
size_t)(s - p) <= len ? StringRef(p, s - p) : StringRef();
200 StringRef after(
const char *s)
const {
201 return (
size_t)(s - p) <= len ? StringRef(s, p + len - s) : StringRef();
203 StringRef substr(
size_t start,
size_t length)
const {
204 if (len <= start)
return 0;
205 if (len <= length)
return StringRef(p + start, len - start);
206 return StringRef(p + start, length);
209 Split split(
char)
const;
210 Split split(
const char *)
const;
284 friend struct StringRef;
285 Split(StringRef r,
const char *s,
const char *p) : rest(r), set(s), ptr(p) {}
288 Split begin()
const {
return *
this; }
289 Split end()
const {
return Split(StringRef(),
nullptr,
nullptr); }
290 StringRef operator*()
const {
return ptr ? rest.before(ptr) : rest; }
291 Split &operator++() {
293 rest = rest.after(ptr + 1);
294 ptr = set ? rest.find(set) : rest.find(*ptr);
300 bool operator==(
const Split &a)
const {
return rest == a.rest && ptr == a.ptr; }
301 bool operator!=(
const Split &a)
const {
return rest != a.rest || ptr != a.ptr; }
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13