Pyrogenesis trunk
CStrIntern.h
Go to the documentation of this file.
1/* Copyright (C) 2021 Wildfire Games.
2 * This file is part of 0 A.D.
3 *
4 * 0 A.D. is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * 0 A.D. is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef INCLUDED_CSTRINTERN
19#define INCLUDED_CSTRINTERN
20
22
23/**
24 * Interned 8-bit strings.
25 * Each instance with the same string content is a pointer to the same piece of
26 * memory, allowing very fast string comparisons.
27 *
28 * Since a CStrIntern is just a dumb pointer, copying is very fast,
29 * and pass-by-value should be preferred over pass-by-reference.
30 *
31 * Memory allocated for strings will never be freed, so don't use this for
32 * unbounded numbers of strings (e.g. text rendered by gameplay scripts) -
33 * it's intended for a small number of short frequently-used strings.
34 *
35 * Not thread-safe - only allocate these strings from the main thread.
36 */
38{
39public:
40 CStrIntern();
41 explicit CStrIntern(const char* str);
42 explicit CStrIntern(const std::string& str);
43
44 /**
45 * Returns cached FNV1-A hash of the string.
46 */
47 u32 GetHash() const;
48
49 /**
50 * Returns null-terminated string.
51 */
52 const char* c_str() const;
53
54 /**
55 * Returns length of string in bytes.
56 */
57 size_t length() const;
58
59 bool empty() const;
60
61 /**
62 * Returns as std::string.
63 */
64 const std::string& string() const;
65
66 /**
67 * String equality.
68 */
69 bool operator==(const CStrIntern& b) const
70 {
71 return m == b.m;
72 }
73
74 bool operator!=(const CStrIntern& b) const
75 {
76 return m != b.m;
77 }
78
79 /**
80 * Compare with some arbitrary total order.
81 * (In particular, this is not alphabetic order,
82 * and is not consistent between runs of the game.)
83 */
84 bool operator<(const CStrIntern& b) const
85 {
86 return m < b.m;
87 }
88
89private:
91};
92
93namespace std
94{
95template<>
96struct hash<CStrIntern>
97{
98 std::size_t operator()(const CStrIntern& str) const
99 {
100 return str.GetHash();
101 }
102};
103}
104
105#endif // INCLUDED_CSTRINTERN
Definition: CStrIntern.cpp:29
Interned 8-bit strings.
Definition: CStrIntern.h:38
CStrInternInternals * m
Definition: CStrIntern.h:90
bool empty() const
Definition: CStrIntern.cpp:144
size_t length() const
Returns length of string in bytes.
Definition: CStrIntern.cpp:139
const char * c_str() const
Returns null-terminated string.
Definition: CStrIntern.cpp:134
bool operator!=(const CStrIntern &b) const
Definition: CStrIntern.h:74
u32 GetHash() const
Returns cached FNV1-A hash of the string.
Definition: CStrIntern.cpp:129
CStrIntern()
Definition: CStrIntern.cpp:114
bool operator<(const CStrIntern &b) const
Compare with some arbitrary total order.
Definition: CStrIntern.h:84
bool operator==(const CStrIntern &b) const
String equality.
Definition: CStrIntern.h:69
const std::string & string() const
Returns as std::string.
Definition: CStrIntern.cpp:149
Definition: ShaderDefines.cpp:31
std::size_t operator()(const CStrIntern &str) const
Definition: CStrIntern.h:98
uint32_t u32
Definition: types.h:39