Files
entt/hashed__string_8hpp_source.html
2018-07-10 16:37:27 +02:00

86 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>entt: src/entt/core/hashed_string.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">entt
&#160;<span id="projectnumber">2.7.1</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_66e9674e8206a335795995fa32a03c91.html">entt</a></li><li class="navelem"><a class="el" href="dir_de8f4e6ba3f54a2a21309f742e93a373.html">core</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">hashed_string.hpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#ifndef ENTT_CORE_HASHED_STRING_HPP</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#define ENTT_CORE_HASHED_STRING_HPP</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;../config/config.h&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceentt.html">entt</a> {</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html"> 22</a></span>&#160;<span class="keyword">class </span><a class="code" href="classentt_1_1HashedString.html">HashedString</a> final {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keyword">struct </span>ConstCharWrapper final {</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="comment">// non-explicit constructor on purpose</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; constexpr ConstCharWrapper(<span class="keyword">const</span> <span class="keywordtype">char</span> *str) ENTT_NOEXCEPT: str{str} {}</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *str;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; };</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keyword">static</span> constexpr std::uint64_t offset = 14695981039346656037ull;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keyword">static</span> constexpr std::uint64_t prime = 1099511628211ull;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="comment">// FowlerNollVo hash function v. 1a - the good</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keyword">static</span> constexpr std::uint64_t helper(std::uint64_t partial, <span class="keyword">const</span> <span class="keywordtype">char</span> *str) ENTT_NOEXCEPT {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">return</span> str[0] == 0 ? partial : helper((partial^str[0])*prime, str+1);</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; }</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#af511100177b5e0213bf5b0efb3f4f528"> 39</a></span>&#160; <span class="keyword">using</span> <a class="code" href="classentt_1_1HashedString.html#af511100177b5e0213bf5b0efb3f4f528">hash_type</a> = std::uint64_t;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">template</span> &lt;std::<span class="keywordtype">size_t</span> N&gt;</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#af9ae25ce87c6183a71026d2c64501f98"> 56</a></span>&#160; constexpr <a class="code" href="classentt_1_1HashedString.html#af9ae25ce87c6183a71026d2c64501f98">HashedString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> (&amp;str)[N]) ENTT_NOEXCEPT</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; : hash{helper(offset, str)}, str{str}</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; {}</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#a56c7a79123eb7f0b63f0b0e218a111b9"> 66</a></span>&#160; <span class="keyword">explicit</span> constexpr <a class="code" href="classentt_1_1HashedString.html#a56c7a79123eb7f0b63f0b0e218a111b9">HashedString</a>(ConstCharWrapper wrapper) ENTT_NOEXCEPT</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; : hash{helper(offset, wrapper.str)}, str{wrapper.str}</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; {}</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#ac93c062eb14c80be82bd75bb6e853be0"> 74</a></span>&#160; constexpr <span class="keyword">operator</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *() <span class="keyword">const</span> ENTT_NOEXCEPT { <span class="keywordflow">return</span> str; }</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#a47843deb0d550b5a6e1129a9b913d85f"> 80</a></span>&#160; constexpr <span class="keyword">operator</span> <a class="code" href="classentt_1_1HashedString.html#af511100177b5e0213bf5b0efb3f4f528">hash_type</a>() const ENTT_NOEXCEPT { <span class="keywordflow">return</span> hash; }</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classentt_1_1HashedString.html#aa5ca9b72d2fa65f2a4796a4ffae00c11"> 87</a></span>&#160; constexpr <span class="keywordtype">bool</span> <a class="code" href="classentt_1_1HashedString.html#aa5ca9b72d2fa65f2a4796a4ffae00c11">operator==</a>(<span class="keyword">const</span> <a class="code" href="classentt_1_1HashedString.html">HashedString</a> &amp;other) <span class="keyword">const</span> ENTT_NOEXCEPT {</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordflow">return</span> hash == other.hash;</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">const</span> <a class="code" href="classentt_1_1HashedString.html#af511100177b5e0213bf5b0efb3f4f528">hash_type</a> hash;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">const</span> <span class="keywordtype">char</span> *str;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;};</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="namespaceentt.html#a8a638f5585d404bbdcfd8efdfeb39203"> 103</a></span>&#160;constexpr <span class="keywordtype">bool</span> <a class="code" href="namespaceentt.html#a8a638f5585d404bbdcfd8efdfeb39203">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classentt_1_1HashedString.html">HashedString</a> &amp;lhs, <span class="keyword">const</span> <a class="code" href="classentt_1_1HashedString.html">HashedString</a> &amp;rhs) ENTT_NOEXCEPT {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">return</span> !(lhs == rhs);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;}</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;}</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;constexpr <a class="code" href="classentt_1_1HashedString.html">entt::HashedString</a> <span class="keyword">operator</span><span class="stringliteral">&quot;&quot;</span> ENTT_HS_SUFFIX(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, std::size_t) ENTT_NOEXCEPT {</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classentt_1_1HashedString.html">entt::HashedString</a>{str};</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;}</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="preprocessor">#endif // ENTT_CORE_HASHED_STRING_HPP</span></div><div class="ttc" id="namespaceentt_html_a8a638f5585d404bbdcfd8efdfeb39203"><div class="ttname"><a href="namespaceentt.html#a8a638f5585d404bbdcfd8efdfeb39203">entt::operator!=</a></div><div class="ttdeci">constexpr bool operator!=(const HashedString &amp;lhs, const HashedString &amp;rhs) ENTT_NOEXCEPT</div><div class="ttdoc">Compares two hashed strings. </div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00103">hashed_string.hpp:103</a></div></div>
<div class="ttc" id="namespaceentt_html"><div class="ttname"><a href="namespaceentt.html">entt</a></div><div class="ttdoc">EnTT default namespace. </div><div class="ttdef"><b>Definition:</b> <a href="algorithm_8hpp_source.html#l00010">algorithm.hpp:10</a></div></div>
<div class="ttc" id="classentt_1_1HashedString_html_a56c7a79123eb7f0b63f0b0e218a111b9"><div class="ttname"><a href="classentt_1_1HashedString.html#a56c7a79123eb7f0b63f0b0e218a111b9">entt::HashedString::HashedString</a></div><div class="ttdeci">constexpr HashedString(ConstCharWrapper wrapper) ENTT_NOEXCEPT</div><div class="ttdoc">Explicit constructor on purpose to avoid constructing a hashed string directly from a const char *...</div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00066">hashed_string.hpp:66</a></div></div>
<div class="ttc" id="classentt_1_1HashedString_html_aa5ca9b72d2fa65f2a4796a4ffae00c11"><div class="ttname"><a href="classentt_1_1HashedString.html#aa5ca9b72d2fa65f2a4796a4ffae00c11">entt::HashedString::operator==</a></div><div class="ttdeci">constexpr bool operator==(const HashedString &amp;other) const ENTT_NOEXCEPT</div><div class="ttdoc">Compares two hashed strings. </div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00087">hashed_string.hpp:87</a></div></div>
<div class="ttc" id="classentt_1_1HashedString_html"><div class="ttname"><a href="classentt_1_1HashedString.html">entt::HashedString</a></div><div class="ttdoc">Zero overhead resource identifier. </div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00022">hashed_string.hpp:22</a></div></div>
<div class="ttc" id="classentt_1_1HashedString_html_af9ae25ce87c6183a71026d2c64501f98"><div class="ttname"><a href="classentt_1_1HashedString.html#af9ae25ce87c6183a71026d2c64501f98">entt::HashedString::HashedString</a></div><div class="ttdeci">constexpr HashedString(const char(&amp;str)[N]) ENTT_NOEXCEPT</div><div class="ttdoc">Constructs a hashed string from an array of const chars. </div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00056">hashed_string.hpp:56</a></div></div>
<div class="ttc" id="classentt_1_1HashedString_html_af511100177b5e0213bf5b0efb3f4f528"><div class="ttname"><a href="classentt_1_1HashedString.html#af511100177b5e0213bf5b0efb3f4f528">entt::HashedString::hash_type</a></div><div class="ttdeci">std::uint64_t hash_type</div><div class="ttdoc">Unsigned integer type. </div><div class="ttdef"><b>Definition:</b> <a href="hashed__string_8hpp_source.html#l00039">hashed_string.hpp:39</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>