ESPHome 2025.6.3
Loading...
Searching...
No Matches
string_ref.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <cstring>
5#include <iterator>
6#include <memory>
7#include <string>
9
10#ifdef USE_JSON
12#endif // USE_JSON
13
14namespace esphome {
15
22class StringRef {
23 public:
24 using traits_type = std::char_traits<char>;
25 using value_type = traits_type::char_type;
26 using allocator_type = std::allocator<char>;
27 using size_type = std::allocator_traits<allocator_type>::size_type;
28 using difference_type = std::allocator_traits<allocator_type>::difference_type;
29 using const_reference = const value_type &;
30 using const_pointer = const value_type *;
32 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
33
34 constexpr StringRef() : base_(""), len_(0) {}
35 explicit StringRef(const std::string &s) : base_(s.c_str()), len_(s.size()) {}
36 explicit StringRef(const char *s) : base_(s), len_(strlen(s)) {}
37 constexpr StringRef(const char *s, size_t n) : base_(s), len_(n) {}
38 template<typename CharT>
39 constexpr StringRef(const CharT *s, size_t n) : base_(reinterpret_cast<const char *>(s)), len_(n) {}
40 template<typename InputIt>
41 StringRef(InputIt first, InputIt last)
42 : base_(reinterpret_cast<const char *>(&*first)), len_(std::distance(first, last)) {}
43 template<typename InputIt>
44 StringRef(InputIt *first, InputIt *last)
45 : base_(reinterpret_cast<const char *>(first)), len_(std::distance(first, last)) {}
46 template<typename CharT, size_t N> constexpr static StringRef from_lit(const CharT (&s)[N]) {
47 return StringRef{s, N - 1};
48 }
49 static StringRef from_maybe_nullptr(const char *s) {
50 if (s == nullptr) {
51 return StringRef();
52 }
53
54 return StringRef(s);
55 }
56
57 constexpr const_iterator begin() const { return base_; };
58 constexpr const_iterator cbegin() const { return base_; };
59
60 constexpr const_iterator end() const { return base_ + len_; };
61 constexpr const_iterator cend() const { return base_ + len_; };
62
63 const_reverse_iterator rbegin() const { return const_reverse_iterator{base_ + len_}; }
64 const_reverse_iterator crbegin() const { return const_reverse_iterator{base_ + len_}; }
65
68
69 constexpr const char *c_str() const { return base_; }
70 constexpr size_type size() const { return len_; }
71 constexpr bool empty() const { return len_ == 0; }
72 constexpr const_reference operator[](size_type pos) const { return *(base_ + pos); }
73
74 std::string str() const { return std::string(base_, len_); }
75 const uint8_t *byte() const { return reinterpret_cast<const uint8_t *>(base_); }
76
77 operator std::string() const { return str(); }
78
79 private:
80 const char *base_;
81 size_type len_;
82};
83
84inline bool operator==(const StringRef &lhs, const StringRef &rhs) {
85 return lhs.size() == rhs.size() && std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs));
86}
87
88inline bool operator==(const StringRef &lhs, const std::string &rhs) {
89 return lhs.size() == rhs.size() && std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs));
90}
91
92inline bool operator==(const std::string &lhs, const StringRef &rhs) { return rhs == lhs; }
93
94inline bool operator==(const StringRef &lhs, const char *rhs) {
95 return lhs.size() == strlen(rhs) && std::equal(std::begin(lhs), std::end(lhs), rhs);
96}
97
98inline bool operator==(const char *lhs, const StringRef &rhs) { return rhs == lhs; }
99
100inline bool operator!=(const StringRef &lhs, const StringRef &rhs) { return !(lhs == rhs); }
101
102inline bool operator!=(const StringRef &lhs, const std::string &rhs) { return !(lhs == rhs); }
103
104inline bool operator!=(const std::string &lhs, const StringRef &rhs) { return !(rhs == lhs); }
105
106inline bool operator!=(const StringRef &lhs, const char *rhs) { return !(lhs == rhs); }
107
108inline bool operator!=(const char *lhs, const StringRef &rhs) { return !(rhs == lhs); }
109
110inline bool operator<(const StringRef &lhs, const StringRef &rhs) {
111 return std::lexicographical_compare(std::begin(lhs), std::end(lhs), std::begin(rhs), std::end(rhs));
112}
113
114inline std::string &operator+=(std::string &lhs, const StringRef &rhs) {
115 lhs.append(rhs.c_str(), rhs.size());
116 return lhs;
117}
118
119inline std::string operator+(const char *lhs, const StringRef &rhs) {
120 auto str = std::string(lhs);
121 str.append(rhs.c_str(), rhs.size());
122 return str;
123}
124
125inline std::string operator+(const StringRef &lhs, const char *rhs) {
126 auto str = lhs.str();
127 str.append(rhs);
128 return str;
129}
130
131#ifdef USE_JSON
132// NOLINTNEXTLINE(readability-identifier-naming)
133void convertToJson(const StringRef &src, JsonVariant dst);
134#endif // USE_JSON
135
136} // namespace esphome
StringRef is a reference to a string owned by something else.
Definition string_ref.h:22
StringRef(const std::string &s)
Definition string_ref.h:35
std::allocator< char > allocator_type
Definition string_ref.h:26
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition string_ref.h:32
const_reverse_iterator crend() const
Definition string_ref.h:67
constexpr const char * c_str() const
Definition string_ref.h:69
constexpr StringRef(const CharT *s, size_t n)
Definition string_ref.h:39
std::char_traits< char > traits_type
Definition string_ref.h:24
const value_type * const_pointer
Definition string_ref.h:30
traits_type::char_type value_type
Definition string_ref.h:25
constexpr const_iterator cend() const
Definition string_ref.h:61
constexpr const_reference operator[](size_type pos) const
Definition string_ref.h:72
constexpr const_iterator begin() const
Definition string_ref.h:57
constexpr StringRef(const char *s, size_t n)
Definition string_ref.h:37
StringRef(const char *s)
Definition string_ref.h:36
constexpr bool empty() const
Definition string_ref.h:71
const_reverse_iterator rbegin() const
Definition string_ref.h:63
constexpr size_type size() const
Definition string_ref.h:70
static constexpr StringRef from_lit(const CharT(&s)[N])
Definition string_ref.h:46
constexpr const_iterator end() const
Definition string_ref.h:60
std::string str() const
Definition string_ref.h:74
std::allocator_traits< allocator_type >::size_type size_type
Definition string_ref.h:27
constexpr StringRef()
Definition string_ref.h:34
std::allocator_traits< allocator_type >::difference_type difference_type
Definition string_ref.h:28
StringRef(InputIt first, InputIt last)
Definition string_ref.h:41
static StringRef from_maybe_nullptr(const char *s)
Definition string_ref.h:49
const value_type & const_reference
Definition string_ref.h:29
const_reverse_iterator rend() const
Definition string_ref.h:66
constexpr const_iterator cbegin() const
Definition string_ref.h:58
const_reverse_iterator crbegin() const
Definition string_ref.h:64
const_pointer const_iterator
Definition string_ref.h:31
const uint8_t * byte() const
Definition string_ref.h:75
StringRef(InputIt *first, InputIt *last)
Definition string_ref.h:44
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string operator+(const char *lhs, const StringRef &rhs)
Definition string_ref.h:119
bool operator==(optional< T > const &x, optional< U > const &y)
Definition optional.h:113
bool operator!=(optional< T > const &x, optional< U > const &y)
Definition optional.h:117
void convertToJson(const StringRef &src, JsonVariant dst)
Definition string_ref.cpp:8
std::string & operator+=(std::string &lhs, const StringRef &rhs)
Definition string_ref.h:114
bool operator<(optional< T > const &x, optional< U > const &y)
Definition optional.h:121