57 using value_type = std::string::value_type;
59 InternedString() =
default;
61 explicit InternedString(
const std::string &v);
63 explicit InternedString(std::string &&v);
65 InternedString(
const char *v);
67 explicit InternedString(std::string_view v);
69 InternedString(std::size_t n,
char c);
71 InternedString(
const InternedString &other);
72 InternedString &operator=(
const InternedString &other);
73 InternedString(InternedString &&other)
noexcept;
74 InternedString &operator=(InternedString &&other)
noexcept;
78 const std::string &
str()
const;
80 bool empty()
const noexcept;
82 std::size_t
size()
const noexcept;
84 using const_iterator = std::string::const_iterator;
85 const_iterator begin()
const noexcept;
86 const_iterator end()
const noexcept;
88 const char &operator[](std::size_t pos)
const;
89 char &operator[](std::size_t pos);
90 const char &back()
const;
91 const char *c_str()
const;
92 const char *data()
const;
97 void push_back(
char c);
98 InternedString &append(
const char *s, std::size_t n);
99 InternedString &operator+=(
const InternedString &other);
100 void resize(std::size_t n,
char c =
'\0');
102 bool operator==(
const InternedString &other)
const noexcept;
103 bool operator!=(
const InternedString &other)
const noexcept;
104 friend bool operator<(
const InternedString &lhs,
105 const InternedString &rhs)
noexcept;
110 std::size_t
refCount()
const noexcept;
114#ifdef ACAV_ENABLE_STRING_STATS
116 static StringInterningStats getStats();
118 static void printStats(
const char *label =
nullptr);
120 static void resetStats();
126 explicit StringData(
const std::string &v);
127 explicit StringData(std::string &&v);
129 std::size_t refCount_ = 0;
134 using is_transparent = void;
135 std::size_t operator()(
const StringData *s)
const noexcept;
136 std::size_t operator()(
const std::string &s)
const noexcept;
137 std::size_t operator()(std::string_view s)
const noexcept;
142 using is_transparent = void;
143 bool operator()(
const StringData *a,
const StringData *b)
const noexcept;
144 bool operator()(
const StringData *a,
const std::string &b)
const noexcept;
145 bool operator()(
const std::string &a,
const StringData *b)
const noexcept;
146 bool operator()(
const StringData *a, std::string_view b)
const noexcept;
147 bool operator()(std::string_view a,
const StringData *b)
const noexcept;
154 static StringData *internString(
const std::string &v);
155 static StringData *internString(std::string &&v);
156 static StringData *internString(std::string_view v);
159 static std::unordered_set<StringData *, Hash, Equal> pool_;
160 static std::mutex poolMutex_;
163 StringData *data_ =
nullptr;