20 static constexpr int INLINE_LENGTH = 12;
24 explicit string_t(uint32_t len) { value.inlined.length = len; }
26 string_t(
const char *data, uint32_t len) { init(data, len); }
30 void init(
const char *data, uint32_t len)
32 value.inlined.length = len;
34 memset(value.inlined.inlined, 0, INLINE_LENGTH);
38 memcpy(value.inlined.inlined, data, size());
40 value.pointer.ptr = (
char *)data;
47 memset(value.inlined.inlined, 0, INLINE_LENGTH);
49 value.pointer.ptr =
nullptr;
51 value.inlined.length = 0;
57 bool is_inlined()
const {
return size() <= INLINE_LENGTH; }
59 const char *data()
const {
return is_inlined() ? value.inlined.inlined : value.pointer.ptr; }
61 char *get_data_writeable()
const {
return is_inlined() ? (
char *)value.inlined.inlined : value.pointer.ptr; }
63 int size()
const {
return value.inlined.length; }
65 bool empty()
const {
return value.inlined.length == 0; }
67 string get_string()
const {
return string(data(), size()); }
69 bool operator==(
const string_t &r)
const
71 if (this->size() != r.size()) {
74 return (memcmp(this->data(), r.data(), this->size()) == 0);
77 bool operator!=(
const string_t &r)
const {
return !(*
this == r); }
79 bool operator>(
const string_t &r)
const
81 const uint32_t left_length = this->size();
82 const uint32_t right_length = r.size();
83 const uint32_t min_length = std::min<uint32_t>(left_length, right_length);
85 auto memcmp_res = memcmp(this->data(), r.data(), min_length);
86 return memcmp_res > 0 || (memcmp_res == 0 && left_length > right_length);
88 bool operator<(
const string_t &r)
const {
return r > *
this; }
Definition: string_t.h:91
Definition: string_t.h:18