10 #define ADOBE_NAME_HPP
19 #include <boost/operators.hpp>
20 #include <boost/type_traits/is_pod.hpp>
23 #include <adobe/conversion.hpp>
24 #include <adobe/cstring.hpp>
53 constexpr std::size_t sizesz_k =
sizeof(std::size_t);
55 constexpr
bool sizeok_k = sizesz_k == 8 || sizesz_k == 4;
57 constexpr std::size_t name_fnv_prime_k =
58 sizesz_k == 8 ?
static_cast<std::size_t
>(0x100000001b3) : static_cast<std::size_t>(0x1000193);
60 constexpr std::size_t name_fnv_basis_k = sizesz_k == 8
61 ?
static_cast<std::size_t
>(0xcbf29ce484222325ULL)
62 : static_cast<std::size_t>(0x811c9dc5);
64 constexpr std::size_t name_hash(
const char* str, std::size_t len, std::size_t n,
66 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
68 return n < len ? name_hash(str, len, n + 1,
69 (state xor static_cast<std::size_t>(str[n])) * name_fnv_prime_k)
73 constexpr std::size_t name_hash(
const char* str, std::size_t len) {
74 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
76 return name_hash(str, len, 0, name_fnv_basis_k);
79 template <std::
size_t N>
80 constexpr std::size_t name_hash(
const char (&str)[N]) {
81 static_assert(sizeok_k,
"Unknown sizeof std::size_t (must be 4 or 8).");
83 return name_hash(str, N - 1);
100 inline constexpr
static_name_t operator"" _name(
const char* str, std::size_t n);
108 using namespace literals;
142 explicit operator bool()
const;
145 return x.hash_m == y.hash_m;
155 constexpr
static_name_t(
const char* str, std::size_t hash) : string_m(str), hash_m(hash) {}
159 friend constexpr
static_name_t literals::operator
"" _name(
const char* str, std::size_t n);
163 const char* string_m;
200 inline constexpr
static_name_t operator"" _name(
const char* str, std::size_t n) {
216 struct name_t : boost::totally_ordered<name_t, name_t> {
217 explicit name_t(
const char* s =
"") : ptr_m(map_string(s)) {}
223 : ptr_m(map_string(static_name.string_m, static_name.hash_m)) {}
234 explicit operator bool()
const;
250 return std::strcmp(x.ptr_m, y.ptr_m) < 0;
253 const char*
c_str()
const {
return ptr_m; }
255 const char*
begin()
const {
return ptr_m; }
256 const char*
end()
const {
return begin() + std::strlen(begin()); }
284 static inline std::size_t hash(
const name_t& x) {
285 return reinterpret_cast<std::size_t
>(x.ptr_m);
288 static const char* map_string(
const char* str);
289 static const char* map_string(
const char* str, std::size_t hash);
326 struct hash<adobe::name_t> {
329 return adobe::name_t::hash(name);
343 struct hash<adobe::static_name_t> {
366 struct is_pod<adobe::name_t> : boost::mpl::true_ {};
friend bool operator==(const name_t &x, const name_t &y)
const char * begin() const
friend bool operator<(const name_t &x, const name_t &y)
friend bool operator!=(const static_name_t &x, const static_name_t &y)
std::ostream & operator<<(std::ostream &out, const array_t &x)
std::size_t operator()(adobe::name_t const &name) const
const char * c_str() const
friend bool operator==(const static_name_t &x, const static_name_t &y)
std::size_t operator()(adobe::static_name_t const &name) const
static bool fast_sort(const name_t &x, const name_t &y)
name_t(const static_name_t &static_name)