HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
seed_generator.hpp
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../assert.hpp"
8#include "../rapid/numeric_array.hpp"
9#include <random>
10#include <concepts>
11
12namespace tt {
13
15public:
16 seed_generator(seed_generator const &) noexcept = default;
17 seed_generator(seed_generator &&) noexcept = default;
18 seed_generator &operator=(seed_generator const &) noexcept = default;
19 seed_generator &operator=(seed_generator &&) noexcept = default;
20
21 [[nodiscard]] seed_generator() noexcept : _device(std::random_device{}) {}
22
23 [[nodiscard]] seed_generator(std::string const &name) noexcept : _device(std::random_device{name}) {}
24
25 template<typename T>
26 [[nodiscard]] T next() noexcept
27 {
28 tt_no_default();
29 }
30
31 template<>
32 [[nodiscard]] unsigned int next() noexcept
33 {
34 return _device();
35 }
36
37 template<>
38 [[nodiscard]] unsigned long next() noexcept
39 {
40 if constexpr (sizeof(unsigned int) == sizeof(unsigned long)) {
41 return static_cast<unsigned long>(next<unsigned int>());
42 } else {
43 auto r = static_cast<unsigned long>(next<unsigned int>());
44 r <<= sizeof(unsigned int) * CHAR_BIT;
45 r |= static_cast<unsigned long>(next<unsigned int>());
46 return r;
47 }
48 }
49
50 template<>
51 [[nodiscard]] unsigned long long next() noexcept
52 {
53 if constexpr (sizeof(unsigned long) == sizeof(unsigned long long)) {
54 return static_cast<unsigned long long>(next<unsigned long>());
55 } else {
56 auto r = static_cast<unsigned long long>(next<unsigned long>());
57 r <<= sizeof(unsigned long) * CHAR_BIT;
58 r |= static_cast<unsigned long long>(next<unsigned long>());
59 return r;
60 }
61 }
62
63 template<>
64 [[nodiscard]] unsigned short next() noexcept
65 {
66 return static_cast<unsigned short>(next<unsigned int>());
67 }
68
69 template<>
70 [[nodiscard]] unsigned char next() noexcept
71 {
72 return static_cast<unsigned char>(next<unsigned int>());
73 }
74
75 template<>
76 [[nodiscard]] u64x2 next() noexcept
77 {
78 return u64x2{next<uint64_t>(), next<uint64_t>()};
79 }
80
81 template<typename T>
82 [[nodiscard]] T next_not_zero() noexcept
83 {
84 T r;
85
86 do {
87 r = next<T>();
88 } while (r == 0);
89
90 return r;
91 }
92
93 template<>
94 [[nodiscard]] u64x2 next_not_zero() noexcept
95 {
96 return u64x2{next_not_zero<uint64_t>(), next_not_zero<uint64_t>()};
97 }
98
99private:
100 std::random_device _device;
101};
102
103
104
105}
Definition seed_generator.hpp:14