diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-10-23 15:17:52 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@byzantine-lab.io> | 2019-06-12 17:27:16 +0800 |
commit | 9f723203a14fbe3f4ac087d2b7309381d7d1b419 (patch) | |
tree | 560f4f7b31186bc0fa3ff7ee18b4aa079c5f6c7a /vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp | |
parent | 18b940c6840e1030be76945207fb5bdf6323d696 (diff) | |
download | go-tangerine-9f723203a14fbe3f4ac087d2b7309381d7d1b419.tar.gz go-tangerine-9f723203a14fbe3f4ac087d2b7309381d7d1b419.tar.zst go-tangerine-9f723203a14fbe3f4ac087d2b7309381d7d1b419.zip |
vendor: use govendor to import dexon-consensus-core
Diffstat (limited to 'vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp')
-rw-r--r-- | vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp b/vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp new file mode 100644 index 000000000..69edaa939 --- /dev/null +++ b/vendor/github.com/dexon-foundation/mcl/include/cybozu/xorshift.hpp @@ -0,0 +1,172 @@ +#pragma once +/** + @file + @brief XorShift + + @author MITSUNARI Shigeo(@herumi) + @author MITSUNARI Shigeo +*/ +#include <cybozu/inttype.hpp> + +namespace cybozu { + +class XorShift { + uint32_t x_, y_, z_, w_; +public: + explicit XorShift(uint32_t x = 0, uint32_t y = 0, uint32_t z = 0, uint32_t w = 0) + { + init(x, y, z, w); + } + void init(uint32_t x = 0, uint32_t y = 0, uint32_t z = 0, uint32_t w = 0) + { + x_ = x ? x : 123456789; + y_ = y ? y : 362436069; + z_ = z ? z : 521288629; + w_ = w ? w : 88675123; + } + uint32_t get32() + { + unsigned int t = x_ ^ (x_ << 11); + x_ = y_; y_ = z_; z_ = w_; + return w_ = (w_ ^ (w_ >> 19)) ^ (t ^ (t >> 8)); + } + uint32_t operator()() { return get32(); } + uint64_t get64() + { + uint32_t a = get32(); + uint32_t b = get32(); + return (uint64_t(a) << 32) | b; + } + template<class T> + void read(T *x, size_t n) + { + const size_t size = sizeof(T) * n; + uint8_t *p8 = static_cast<uint8_t*>(x); + for (size_t i = 0; i < size; i++) { + p8[i] = static_cast<uint8_t>(get32()); + } + } + void read(uint32_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get32(); + } + } + void read(uint64_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get64(); + } + } +}; + +// see http://xorshift.di.unimi.it/xorshift128plus.c +class XorShift128Plus { + uint64_t s_[2]; + static const uint64_t seed0 = 123456789; + static const uint64_t seed1 = 987654321; +public: + explicit XorShift128Plus(uint64_t s0 = seed0, uint64_t s1 = seed1) + { + init(s0, s1); + } + void init(uint64_t s0 = seed0, uint64_t s1 = seed1) + { + s_[0] = s0; + s_[1] = s1; + } + uint32_t get32() + { + return static_cast<uint32_t>(get64()); + } + uint64_t operator()() { return get64(); } + uint64_t get64() + { + uint64_t s1 = s_[0]; + const uint64_t s0 = s_[1]; + s_[0] = s0; + s1 ^= s1 << 23; + s_[1] = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5); + return s_[1] + s0; + } + template<class T> + void read(T *x, size_t n) + { + const size_t size = sizeof(T) * n; + uint8_t *p8 = static_cast<uint8_t*>(x); + for (size_t i = 0; i < size; i++) { + p8[i] = static_cast<uint8_t>(get32()); + } + } + void read(uint32_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get32(); + } + } + void read(uint64_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get64(); + } + } +}; + +// see http://xoroshiro.di.unimi.it/xoroshiro128plus.c +class Xoroshiro128Plus { + uint64_t s_[2]; + static const uint64_t seed0 = 123456789; + static const uint64_t seed1 = 987654321; + uint64_t rotl(uint64_t x, unsigned int k) const + { + return (x << k) | (x >> (64 - k)); + } +public: + explicit Xoroshiro128Plus(uint64_t s0 = seed0, uint64_t s1 = seed1) + { + init(s0, s1); + } + void init(uint64_t s0 = seed0, uint64_t s1 = seed1) + { + s_[0] = s0; + s_[1] = s1; + } + uint32_t get32() + { + return static_cast<uint32_t>(get64()); + } + uint64_t operator()() { return get64(); } + uint64_t get64() + { + uint64_t s0 = s_[0]; + uint64_t s1 = s_[1]; + uint64_t result = s0 + s1; + s1 ^= s0; + s_[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); + s_[1] = rotl(s1, 36); + return result; + } + template<class T> + void read(T *x, size_t n) + { + const size_t size = sizeof(T) * n; + uint8_t *p8 = static_cast<uint8_t*>(x); + for (size_t i = 0; i < size; i++) { + p8[i] = static_cast<uint8_t>(get32()); + } + } + void read(uint32_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get32(); + } + } + void read(uint64_t *x, size_t n) + { + for (size_t i = 0; i < n; i++) { + x[i] = get64(); + } + } +}; + +} // cybozu |