48 explicit Identifier(uint32_t len) : length_(len) {}
52 const char* data()
const {
return data_; }
53 char* data() {
return data_; }
57 uint32_t length()
const {
return length_; }
60 const char* c_str()
const {
70 static void operator delete(
void* ptr)
noexcept { ::operator
delete(ptr); }
71 static void operator delete(
void* ptr, size_t)
noexcept { ::operator
delete(ptr); }
74 std::string toString()
const {
75 return std::string(data_, length_);
79 bool equals(
const char* str,
size_t len)
const {
80 if (len != length_)
return false;
81 return memcmp(data_, str, len) == 0;
84 bool equals(
const char* str)
const {
85 return equals(str, std::char_traits<char>::length(str));
88 bool equals(
const std::string& str)
const {
89 return equals(str.c_str(), str.length());
93 return equals(sv.data(), sv.size());
97 static size_t hash(
const char* data,
size_t len) {
100 for (
size_t i = 0; i < len; ++i) {
101 h = ((h << 5) + h) + static_cast<unsigned char>(data[i]);
107 size_t hash()
const {
109 return hash(data_, length_);
114 bool starts_with(
const char* prefix)
const {
115 size_t prefix_len = strlen(prefix);
116 if (
static_cast<size_t>(length_) < prefix_len)
return false;
117 return memcmp(data_, prefix, prefix_len) == 0;
120 bool starts_with(
const std::string& prefix)
const {
121 return starts_with(prefix.c_str());
125 bool ends_with(
const char* suffix)
const {
126 size_t suffix_len = strlen(suffix);
127 if (
static_cast<size_t>(length_) < suffix_len)
return false;
128 return memcmp(data_ + length_ - suffix_len, suffix, suffix_len) == 0;
131 bool ends_with(
const std::string& suffix)
const {
132 return ends_with(suffix.c_str());
136 friend class IdentifierTable;