Gamedev Framework (gf)  0.6.0
A C++11 framework for 2D games
Id.h
1 /*
2  * Gamedev Framework (gf)
3  * Copyright (C) 2016-2017 Julien Bernard
4  *
5  * This software is provided 'as-is', without any express or implied
6  * warranty. In no event will the authors be held liable for any damages
7  * arising from the use of this software.
8  *
9  * Permission is granted to anyone to use this software for any purpose,
10  * including commercial applications, and to alter it and redistribute it
11  * freely, subject to the following restrictions:
12  *
13  * 1. The origin of this software must not be misrepresented; you must not
14  * claim that you wrote the original software. If you use this software
15  * in a product, an acknowledgment in the product documentation would be
16  * appreciated but is not required.
17  * 2. Altered source versions must be plainly marked as such, and must not be
18  * misrepresented as being the original software.
19  * 3. This notice may not be removed or altered from any source distribution.
20  */
21 #ifndef GF_ID_H
22 #define GF_ID_H
23 
24 #include <cstdint>
25 #include <string>
26 
27 #include "Portability.h"
28 #include "StringRef.h"
29 
30 namespace gf {
31 #ifndef DOXYGEN_SHOULD_SKIP_THIS
32 inline namespace v1 {
33 #endif
34 
35  /**
36  * @ingroup core
37  * @brief An identifier
38  */
39  using Id = uint64_t;
40 
41  /**
42  * @ingroup core
43  * @brief The invalid id (which is 0)
44  */
45  constexpr Id InvalidId = 0;
46 
47  /**
48  * @ingroup core
49  * @brief Get an identifier from a string
50  *
51  * The hash is a Fowler–Noll–Vo 1a hash. This function is mainly for
52  * internal use. You should instead use the user-defined literal `_id`.
53  *
54  * Example:
55  *
56  * ~~~{.cc}
57  * gf::Id id = "A string"_id; // computed at compile time
58  * ~~~
59  *
60  * @param str The string
61  * @param sz The size of the string
62  */
63  constexpr Id hash(const char *str, std::size_t sz) {
64  return sz == 0 ? 0xcbf29ce484222325 : (str[sz - 1] ^ hash(str, sz - 1)) * 0x100000001b3;
65  }
66 
67  /**
68  * @ingroup core
69  * @brief Get an idenfitier from a string
70  *
71  * The hash is a Fowler–Noll–Vo 1a hash. This function can be used
72  * for computing an id at runtime. For computing an id from a string
73  * at compile time, you should use the the user-defined literal `_id`.
74  *
75  * @param str The string
76  * @returns The hash of the string
77  */
78  constexpr Id hash(StringRef str) {
79  return hash(str.getData(), str.getSize());
80  }
81 
82  namespace literals {
83 
84  /**
85  * @brief User defined operator for creating compile time ids from strings
86  *
87  * To use it, you have to use the `gf::literals` namespace:
88  *
89  * ~~~{.cc}
90  * using namespace gf::literals;
91  *
92  * Id id = "FooBar"_id;
93  * ~~~
94  *
95  */
96  constexpr gf::Id operator"" _id(const char *str, std::size_t sz) {
97  return gf::hash(str, sz);
98  }
99 
100  }
101 
102 #ifndef DOXYGEN_SHOULD_SKIP_THIS
103 }
104 #endif
105 }
106 
107 #endif // GF_ID_H
constexpr const char * getData() const noexcept
Get a pointer to the string.
Definition: StringRef.h:111
constexpr Id hash(StringRef str)
Get an idenfitier from a string.
Definition: Id.h:78
The namespace for literals.
Definition: Id.h:82
constexpr Id hash(const char *str, std::size_t sz)
Get an identifier from a string.
Definition: Id.h:63
The namespace for gf classes.
Definition: Action.h:34
A constant reference to a string and its size.
Definition: StringRef.h:41
constexpr gf::Id operator"" _id(const char *str, std::size_t sz)
User defined operator for creating compile time ids from strings.
Definition: Id.h:96
constexpr Id InvalidId
The invalid id (which is 0)
Definition: Id.h:45
constexpr std::size_t getSize() const noexcept
Get the size of the string.
Definition: StringRef.h:120