21#include <boost/mpl/bool.hpp>
22#include <boost/operators.hpp>
54constexpr std::size_t sizesz_k =
sizeof(std::size_t);
56constexpr bool sizeok_k = sizesz_k == 8 || sizesz_k == 4;
58constexpr std::size_t name_fnv_prime_k =
59 sizesz_k == 8 ?
static_cast<std::size_t
>(0x100000001b3) : static_cast<std::size_t>(0x1000193);
61constexpr std::size_t name_fnv_basis_k = sizesz_k == 8
62 ?
static_cast<std::size_t
>(0xcbf29ce484222325ULL)
63 :
static_cast<std::size_t
>(0x811c9dc5);
65constexpr std::size_t name_hash(
const char* str, std::size_t len, std::size_t n,
67 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
69 return n < len ? name_hash(str, len, n + 1,
70 (state ^
static_cast<std::size_t
>(str[n])) * name_fnv_prime_k)
74constexpr std::size_t name_hash(
const char* str, std::size_t len) {
75 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
77 return name_hash(str, len, 0, name_fnv_basis_k);
80template <std::
size_t N>
81constexpr std::size_t name_hash(
const char (&str)[N]) {
82 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
84 return name_hash(str, N - 1);
101inline constexpr static_name_t operator""_name(
const char* str, std::size_t n);
135struct static_name_t {
143 explicit operator bool()
const;
145 friend bool operator==(
const static_name_t& x,
const static_name_t& y) {
146 return x.hash_m == y.hash_m;
149 friend bool operator!=(
const static_name_t& x,
const static_name_t& y) {
return !(x == y); }
151 friend bool operator<(
const static_name_t& x,
const static_name_t& y);
155 std::size_t
hash()
const {
return hash_m; }
164 friend constexpr static_name_t literals::operator
""_name(
const char* str, std::size_t n);
166 friend std::ostream&
operator<<(std::ostream& s,
const static_name_t& name);
168 const char* string_m;
204inline constexpr static_name_t operator""_name(
const char* str, std::size_t n) {
220struct name_t : boost::totally_ordered<name_t, name_t> {
224 explicit name_t(
const char* s =
"") : ptr_m(map_string(s)) {}
225 operator std::string_view()
const {
return ptr_m; }
231 : ptr_m(map_string(static_name.string_m, static_name.hash_m, true)) {}
242 explicit operator bool()
const;
258 return std::strcmp(x.ptr_m, y.ptr_m) < 0;
261 const char*
c_str()
const {
return ptr_m; }
263 const char*
begin()
const {
return ptr_m; }
287 [[deprecated(
"use `fast_compare{}` instead")]]
static inline bool fast_sort(
const name_t& x,
289 return hash(x) < hash(y);
293 friend struct std::hash<
name_t>;
302 static inline std::size_t hash(
const name_t& x) {
return std::hash<const char*>{}(x.ptr_m); }
304 static const char* map_string(
const char* str);
305 static const char* map_string(
const char* str, std::size_t hash,
bool is_static);
345 return adobe::name_t::hash(name);
362 return std::hash<adobe::name_t>()(name);
bool operator()(const name_t &x, const name_t &y) const
A character string class for immutable strings.
const char * c_str() const
const char * begin() const
friend std::ostream & operator<<(std::ostream &s, const name_t &name)
const char * const_iterator
friend bool operator==(const name_t &x, const name_t &y)
friend bool operator<(const name_t &x, const name_t &y)
static bool fast_sort(const name_t &x, const name_t &y)
name_t(const static_name_t &static_name)
Utility wrapper to construct name_t with strings of static storage duration.
friend bool operator==(const static_name_t &x, const static_name_t &y)
friend bool operator<(const static_name_t &x, const static_name_t &y)
friend bool operator!=(const static_name_t &x, const static_name_t &y)
friend std::ostream & operator<<(std::ostream &s, const static_name_t &name)
std::size_t hash() const
Return the hash value of the name_t.
std::size_t operator()(adobe::name_t const &name) const
std::size_t operator()(adobe::static_name_t const &name) const