32 #ifndef MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_HPP 33 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_HPP 40 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_KBOX(N) \ 41 s0 += ThreefryKBox<T, K, N>::template key<0>(par); \ 42 s1 += ThreefryKBox<T, K, N>::template key<1>(par); 44 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N) \ 46 constexpr int L0 = Constants::rotate::value[0][(N - 1) % 8]; \ 47 constexpr int R0 = 32 - L0; \ 49 s1 = (s1 << L0) | (s1 >> R0); \ 53 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_CYCLE_4(N) \ 54 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 1); \ 55 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 2); \ 56 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 3); \ 57 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 4); \ 58 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_KBOX(N * 8 + 4); 60 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_CYCLE_8(N) \ 61 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 1); \ 62 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 2); \ 63 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 3); \ 64 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 4); \ 65 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_KBOX(N * 8 + 4); \ 66 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 5); \ 67 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 6); \ 68 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 7); \ 69 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_RBOX(N * 8 + 8); \ 70 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_KBOX(N * 8 + 8); 72 #define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_ROUND_20 \ 73 T s0 = std::get<0>(buf.s); \ 74 T s1 = std::get<1>(buf.s); \ 75 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_KBOX(0) \ 76 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_CYCLE_8(0) \ 77 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_CYCLE_8(1) \ 78 MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_CYCLE_4(2) \ 79 std::get<0>(buf.s) = s0; \ 80 std::get<1>(buf.s) = s1; 89 static_assert(std::numeric_limits<T>::digits == 32,
90 "**Threefry2x32GeneratorGenericImpl** used with T other than a " 91 "32-bit unsigned integers");
93 static constexpr std::size_t K = 2;
94 static constexpr std::size_t Rounds = 20;
99 const void *plain,
void *cipher,
const std::array<T, K + 4> &par)
103 std::array<char, sizeof(T) * K> r;
106 std::memcpy(buf.s.data(), plain,
sizeof(T) * K);
107 union_le<char>(buf.s);
110 std::memcpy(cipher, buf.s.data(),
sizeof(T) * K);
113 template <
typename ResultType>
115 Counter<T, K> &ctr, ResultType *r,
const std::array<T, K + 4> &par)
120 std::array<ResultType,
sizeof(T) * K /
sizeof(ResultType)> r;
125 #if MCKL_REQUIRE_ENDIANNESS_NEUTURAL 126 union_le<typename Counter<T, K>::value_type>(buf.s);
129 #if MCKL_REQUIRE_ENDIANNESS_NEUTURAL 132 std::memcpy(r, buf.r.data(),
sizeof(T) * K);
135 template <
typename ResultType>
137 const std::array<T, K + 4> &par)
139 constexpr std::size_t R =
sizeof(T) * K /
sizeof(ResultType);
141 for (std::size_t i = 0; i != n; ++i, r += R) {
151 #endif // MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_HPP static void eval(Counter< T, K > &ctr, ResultType *r, const std::array< T, K+4 > &par)
#define MCKL_RANDOM_INTERNAL_THREEFRY_GENERIC_2X32_ROUND_20
typename internal::CounterImpl< T, K >::type Counter
A counter type with the same width as std::array<T, K> but with possibly fewer elements.
static void eval(const void *plain, void *cipher, const std::array< T, K+4 > &par)
Default Threefry constants.
static void eval(Counter< T, K > &ctr, std::size_t n, ResultType *r, const std::array< T, K+4 > &par)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
#define MCKL_ALIGNMENT
The default alignment for scalar type.