36 using size_type = std::allocator_traits<allocator_type>::size_type;
45 explicit StringRef(
const char *s) : base_(s), len_(strlen(s)) {}
46 constexpr StringRef(
const char *s,
size_t n) : base_(s), len_(n) {}
47 template<
typename CharT>
48 constexpr StringRef(
const CharT *s,
size_t n) : base_(reinterpret_cast<const char *>(s)), len_(n) {}
49 template<
typename InputIt>
51 : base_(reinterpret_cast<const char *>(&*first)), len_(
std::distance(first, last)) {}
52 template<
typename InputIt>
54 : base_(reinterpret_cast<const char *>(first)), len_(
std::distance(first, last)) {}
55 template<
typename CharT,
size_t N>
constexpr static StringRef from_lit(
const CharT (&s)[N]) {
78 constexpr const char *
c_str()
const {
return base_; }
81 constexpr bool empty()
const {
return len_ == 0; }
86 return len_ >= prefix.len_ && (prefix.len_ == 0 || std::memcmp(base_, prefix.base_, prefix.len_) == 0);
96 std::memcpy(dest, base_ +
pos, actual);
100 std::string
str()
const {
return std::string(base_, len_); }
101 const uint8_t *
byte()
const {
return reinterpret_cast<const uint8_t *
>(base_); }
103 operator std::string()
const {
return str(); }
107 size_type common = std::min(len_, other.len_);
108 int result = common == 0 ? 0 : std::memcmp(base_, other.base_, common);
111 if (len_ < other.len_)
113 if (len_ > other.len_)
124 return std::string::npos;
125 const char *result = std::strstr(base_ +
pos, s);
127 if (result && result + std::strlen(s) <= base_ + len_)
128 return static_cast<size_type>(result - base_);
129 return std::string::npos;
133 return std::string::npos;
134 const void *result = std::memchr(base_ +
pos,
static_cast<unsigned char>(c), len_ -
pos);
135 return result ?
static_cast<size_type>(
static_cast<const char *
>(result) - base_) : std::string::npos;
141 return std::string();
143 return std::string(base_ +
pos, actual_count);
152 return lhs.
size() == rhs.
size() && std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs));
156 return lhs.
size() == rhs.size() && std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs));
162 return lhs.
size() == strlen(rhs) && std::equal(std::begin(lhs), std::end(lhs), rhs);
179 PGM_P p =
reinterpret_cast<PGM_P
>(rhs);
180 size_t rhs_len = strlen_P(p);
181 if (lhs.
size() != rhs_len) {
184 return memcmp_P(lhs.
c_str(), p, rhs_len) == 0;
196 return std::lexicographical_compare(std::begin(lhs), std::end(lhs), std::begin(rhs), std::end(rhs));
205 auto str = std::string(lhs);
211 auto str = lhs.
str();
217 auto str = lhs.
str();
223 std::string str(lhs);
239 constexpr size_t size()
const {
return this->ref_.
size(); }
243 size_t write_to(
char *buf,
size_t buf_size)
const {
246 size_t len = std::min(this->ref_.
size(), buf_size - 1);
248 memcpy_P(buf, this->ref_.
c_str(),
len);
250 std::memcpy(buf, this->ref_.
c_str(),
len);
259 return other.
size() == this->ref_.
size() &&
260 (other.
empty() || memcmp_P(other.
c_str(), this->ref_.c_str(), other.
size()) == 0);
262 return other == this->ref_;
273 "May point to flash; use progmem_ptr() or the owner's accessors. Removed in 2027.5.0")]]
constexpr const char *
275 return this->ref_.
c_str();
313 R result = conv(str.
c_str(), &
end, base);
349 dst.set(JsonString(
src.c_str(),
src.size(),
false));
A string that may live in flash (on ESP8266): pointer and length, with no byte-reading operations.
constexpr const char * progmem_ptr() const
size_t write_to(char *buf, size_t buf_size) const
Copy into buf (null terminated, truncated to fit), returns the length copied.
static constexpr ProgmemStringRef from_lit(const char(&s)[N])
A PROGMEM char array, with its length known at compile time.
constexpr ProgmemStringRef()=default
constexpr ProgmemStringRef(const char *s, size_t len)
constexpr ProgmemStringRef(const StringRef &s)
constexpr const StringRef & ram_ref() const
The string is in RAM here, so it can be viewed directly.
bool equals(const StringRef &other) const
constexpr size_t size() const
constexpr const char * c_str() const
constexpr bool empty() const
StringRef is a reference to a string owned by something else.
bool starts_with(const char *prefix) const
StringRef(const std::string &s)
std::allocator< char > allocator_type
std::reverse_iterator< const_iterator > const_reverse_iterator
size_type find(char c, size_type pos=0) const
const_reverse_iterator crend() const
constexpr const char * c_str() const
bool starts_with(const std::string &prefix) const
constexpr StringRef(const CharT *s, size_t n)
std::char_traits< char > traits_type
const value_type * const_pointer
constexpr size_type length() const
int compare(const StringRef &other) const
Compare (compatible with std::string::compare)
size_type find(const char *s, size_type pos=0) const
Find first occurrence of substring, returns std::string::npos if not found.
traits_type::char_type value_type
constexpr const_iterator cend() const
constexpr const_reference operator[](size_type pos) const
size_type copy(char *dest, size_type count, size_type pos=0) const
Copy characters to destination buffer (std::string::copy-like, but returns 0 instead of throwing on o...
constexpr const_iterator begin() const
int compare(const char *s) const
constexpr StringRef(const char *s, size_t n)
bool starts_with(const StringRef &prefix) const
True if the view begins with the given prefix (std::string::starts_with-like)
constexpr bool empty() const
const_reverse_iterator rbegin() const
constexpr size_type size() const
static constexpr StringRef from_lit(const CharT(&s)[N])
constexpr const_iterator end() const
std::allocator_traits< allocator_type >::size_type size_type
std::string substr(size_type pos=0, size_type count=std::string::npos) const
Return substring as std::string.
std::allocator_traits< allocator_type >::difference_type difference_type
StringRef(InputIt first, InputIt last)
static StringRef from_maybe_nullptr(const char *s)
int compare(const std::string &s) const
const value_type & const_reference
const_reverse_iterator rend() const
constexpr const_iterator cbegin() const
const_reverse_iterator crbegin() const
const_pointer const_iterator
const uint8_t * byte() const
StringRef(InputIt *first, InputIt *last)
R parse_number(const StringRef &str, size_t *pos, F conv)
JsonString linked(const char *s)
std::string operator+(const char *lhs, const StringRef &rhs)
bool operator!=(const StringRef &lhs, const StringRef &rhs)
double stod(const StringRef &str, size_t *pos=nullptr)
void convertToJson(const StringRef &src, JsonVariant dst)
bool operator<(const StringRef &lhs, const StringRef &rhs)
std::string & operator+=(std::string &lhs, const StringRef &rhs)
float stof(const StringRef &str, size_t *pos=nullptr)
bool operator==(const StringRef &lhs, const StringRef &rhs)
int stoi(const StringRef &str, size_t *pos=nullptr, int base=10)
long stol(const StringRef &str, size_t *pos=nullptr, int base=10)
const __FlashStringHelper * ProgmemStr