X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FRandom-inl.h;h=39fbd8e41a6b7b6d730f0d2068d27aaeefa3ab8b;hp=f3b0433be02ee07cf29dd0397a4d693160bfded6;hb=337e3b8a157210eea33c88361b5e4c45a5efc462;hpb=e2c2baadf630b96b9a52debcd4ba1888af82be8e diff --git a/folly/Random-inl.h b/folly/Random-inl.h index f3b0433b..39fbd8e4 100644 --- a/folly/Random-inl.h +++ b/folly/Random-inl.h @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,82 +27,35 @@ namespace detail { // For some (mersenne_twister_engine), this is exported as a state_size static // data member; for others, the standard shows formulas. -template struct StateSize { +template +struct StateSize { // A sane default. - static constexpr size_t value = 512; + using type = std::integral_constant; }; template -constexpr size_t StateSize::value; +struct StateSize> { + using type = std::integral_constant; +}; template struct StateSize> { // From the standard [rand.eng.lcong], this is ceil(log2(m) / 32) + 3, // which is the same as ceil(ceil(log2(m) / 32) + 3, and // ceil(log2(m)) <= std::numeric_limits::digits - static constexpr size_t value = - (std::numeric_limits::digits + 31) / 32 + 3; -}; - -template -constexpr size_t -StateSize>::value; - -template -struct StateSize> { - static constexpr size_t value = - std::mersenne_twister_engine::state_size; + using type = std::integral_constant< + size_t, + (std::numeric_limits::digits + 31) / 32 + 3>; }; -template -constexpr size_t -StateSize>::value; - -#if FOLLY_HAVE_EXTRANDOM_SFMT19937 - -template -struct StateSize<__gnu_cxx::simd_fast_mersenne_twister_engine< - UIntType, m, pos1, sl1, sl2, sr1, sr2, msk1, msk2, msk3, msk4, - parity1, parity2, parity3, parity4>> { - static constexpr size_t value = - __gnu_cxx::simd_fast_mersenne_twister_engine< - UIntType, m, pos1, sl1, sl2, sr1, sr2, - msk1, msk2, msk3, msk4, - parity1, parity2, parity3, parity4>::state_size; -}; - -template -constexpr size_t -StateSize<__gnu_cxx::simd_fast_mersenne_twister_engine< - UIntType, m, pos1, sl1, sl2, sr1, sr2, msk1, msk2, msk3, msk4, - parity1, parity2, parity3, parity4>>::value; - -#endif - template struct StateSize> { // [rand.eng.sub]: r * ceil(w / 32) - static constexpr size_t value = r * ((w + 31) / 32); + using type = std::integral_constant; }; -template -constexpr size_t -StateSize>::value; +template +using StateSizeT = _t>; template struct SeedData { @@ -110,24 +63,24 @@ struct SeedData { Random::secureRandom(seedData.data(), seedData.size() * sizeof(uint32_t)); } - static constexpr size_t stateSize = StateSize::value; + static constexpr size_t stateSize = StateSizeT::value; std::array seedData; }; -} // namespace detail +} // namespace detail -template -void Random::seed(ValidRNG& rng) { +template +void Random::seed(RNG& rng) { detail::SeedData sd; std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData)); rng.seed(s); } -template -auto Random::create() -> ValidRNG { +template +auto Random::create() -> RNG { detail::SeedData sd; std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData)); return RNG(s); } -} // namespaces +} // namespace folly