This commit is contained in:
bthomee
2025-07-22 15:47:16 +00:00
parent 683c0b9982
commit 912e1ed1ac
13 changed files with 70 additions and 80 deletions

View File

@@ -109,57 +109,47 @@ $(function() {
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="keyword">template</span> &lt;<span class="keyword">class</span> Generator&gt;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="namespacebeast.html#a6894f6dcd09bceda3986ebb1ea7a3eed"> 34</a></span><a class="code hl_function" href="namespacebeast.html#a6894f6dcd09bceda3986ebb1ea7a3eed">rngfill</a>(<span class="keywordtype">void</span>* buffer, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> bytes, Generator&amp; g)</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="namespacebeast.html#ad4d3145468ad564a92ac41b9812274a0"> 34</a></span><a class="code hl_function" href="namespacebeast.html#ad4d3145468ad564a92ac41b9812274a0">rngfill</a>(<span class="keywordtype">void</span>* <span class="keyword">const</span> buffer, <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> bytes, Generator&amp; g)</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span>{</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">using </span>result_type = <span class="keyword">typename</span> Generator::result_type;</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordflow">while</span> (bytes &gt;= <span class="keyword">sizeof</span>(result_type))</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> {</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keyword">auto</span> <span class="keyword">const</span> v = g();</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/byte/memcpy.html">std::memcpy</a>(buffer, &amp;v, <span class="keyword">sizeof</span>(v));</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> buffer = <span class="keyword">reinterpret_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a>*<span class="keyword">&gt;</span>(buffer) + <span class="keyword">sizeof</span>(v);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> bytes -= <span class="keyword">sizeof</span>(v);</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> }</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> bytes &lt; <span class="keyword">sizeof</span>(result_type), <span class="stringliteral">&quot;beast::rngfill(void*) : maximum bytes&quot;</span>);</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor">#ifdef __GNUC__</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="comment">// gcc 11.1 (falsely) warns about an array-bounds overflow in release mode.</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="comment">// gcc 12.1 (also falsely) warns about an string overflow in release mode.</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#pragma GCC diagnostic push</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#pragma GCC diagnostic ignored &quot;-Warray-bounds&quot;</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#pragma GCC diagnostic ignored &quot;-Wstringop-overflow&quot;</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">if</span> (bytes &gt; 0)</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> {</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">auto</span> <span class="keyword">const</span> v = g();</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/byte/memcpy.html">std::memcpy</a>(buffer, &amp;v, bytes);</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> }</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> </div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="preprocessor">#ifdef __GNUC__</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="preprocessor">#pragma GCC diagnostic pop</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>}</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="keyword">template</span> &lt;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keyword">class </span>Generator,</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> N,</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">class </span>= <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/enable_if.html">std::enable_if_t</a>&lt;N % <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Generator::result_type) == 0&gt;&gt;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"><a class="line" href="namespacebeast.html#a3c2683b0fd77fcae6b6ef91fb90e5cbc"> 73</a></span><a class="code hl_function" href="namespacebeast.html#a6894f6dcd09bceda3986ebb1ea7a3eed">rngfill</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/array.html">std::array&lt;std::uint8_t, N&gt;</a>&amp; a, Generator&amp; g)</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span>{</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">using </span>result_type = <span class="keyword">typename</span> Generator::result_type;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keyword">auto</span> i = N / <span class="keyword">sizeof</span>(result_type);</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> result_type* p = <span class="keyword">reinterpret_cast&lt;</span>result_type*<span class="keyword">&gt;</span>(a.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/array/data.html">data</a>());</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">while</span> (i--)</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> *p++ = g();</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span>}</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span>} <span class="comment">// namespace beast</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> </div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">constexpr</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> result_size = <span class="keyword">sizeof</span>(result_type);</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a>* <span class="keyword">const</span> buffer_start = <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a>*<span class="keyword">&gt;</span>(buffer);</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> complete_iterations = bytes / result_size;</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> bytes_remaining = bytes % result_size;</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordflow">for</span> (<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> count = 0; count &lt; complete_iterations; ++count)</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> {</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> result_type <span class="keyword">const</span> v = g();</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> offset = count * result_size;</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/byte/memcpy.html">std::memcpy</a>(buffer_start + offset, &amp;v, result_size);</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> }</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keywordflow">if</span> (bytes_remaining &gt; 0)</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> result_type <span class="keyword">const</span> v = g();</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> offset = complete_iterations * result_size;</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/byte/memcpy.html">std::memcpy</a>(buffer_start + offset, &amp;v, bytes_remaining);</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> }</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span>}</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="keyword">template</span> &lt;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">class </span>Generator,</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> N,</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keyword">class </span>= <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/enable_if.html">std::enable_if_t</a>&lt;N % <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Generator::result_type) == 0&gt;&gt;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="keywordtype">void</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"><a class="line" href="namespacebeast.html#a3c2683b0fd77fcae6b6ef91fb90e5cbc"> 63</a></span><a class="code hl_function" href="namespacebeast.html#ad4d3145468ad564a92ac41b9812274a0">rngfill</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/array.html">std::array&lt;std::uint8_t, N&gt;</a>&amp; a, Generator&amp; g)</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>{</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keyword">using </span>result_type = <span class="keyword">typename</span> Generator::result_type;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keyword">auto</span> i = N / <span class="keyword">sizeof</span>(result_type);</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> result_type* p = <span class="keyword">reinterpret_cast&lt;</span>result_type*<span class="keyword">&gt;</span>(a.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/array/data.html">data</a>());</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keywordflow">while</span> (i--)</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> *p++ = g();</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span>}</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> </div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span>} <span class="comment">// namespace beast</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="preprocessor">#endif</span></div>
<div class="ttc" id="aarray_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/array.html">array</a></div></div>
<div class="ttc" id="acstdint_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cstdint.html">cstdint</a></div></div>
<div class="ttc" id="acstring_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cstring.html">cstring</a></div></div>
@@ -168,7 +158,7 @@ $(function() {
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint8_t</a></div></div>
<div class="ttc" id="amemcpy_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/byte/memcpy.html">std::memcpy</a></div><div class="ttdeci">T memcpy(T... args)</div></div>
<div class="ttc" id="anamespacebeast_html"><div class="ttname"><a href="namespacebeast.html">beast</a></div><div class="ttdef"><b>Definition:</b> <a href="base__uint_8h_source.html#l00662">base_uint.h:662</a></div></div>
<div class="ttc" id="anamespacebeast_html_a6894f6dcd09bceda3986ebb1ea7a3eed"><div class="ttname"><a href="namespacebeast.html#a6894f6dcd09bceda3986ebb1ea7a3eed">beast::rngfill</a></div><div class="ttdeci">void rngfill(void *buffer, std::size_t bytes, Generator &amp;g)</div><div class="ttdef"><b>Definition:</b> <a href="rngfill_8h_source.html#l00034">rngfill.h:34</a></div></div>
<div class="ttc" id="anamespacebeast_html_ad4d3145468ad564a92ac41b9812274a0"><div class="ttname"><a href="namespacebeast.html#ad4d3145468ad564a92ac41b9812274a0">beast::rngfill</a></div><div class="ttdeci">void rngfill(void *const buffer, std::size_t const bytes, Generator &amp;g)</div><div class="ttdef"><b>Definition:</b> <a href="rngfill_8h_source.html#l00034">rngfill.h:34</a></div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="atype_traits_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/type_traits.html">type_traits</a></div></div>
</div><!-- fragment --></div><!-- contents -->