Fix FBString under MSVC
[folly.git] / folly / Random-inl.h
index 9da9a824bfe011abf1919255543e45c78daeeaa2..405ef1ffa189798b86566b3329d1bdadccab3139 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 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.
@@ -18,6 +18,8 @@
 #error This file may only be included from folly/Random.h
 #endif
 
+#include <array>
+
 namespace folly {
 
 namespace detail {
@@ -67,7 +69,7 @@ constexpr size_t
 StateSize<std::mersenne_twister_engine<UIntType, w, n, m, r,
                                        a, u, d, s, b, t, c, l, f>>::value;
 
-#if FOLLY_USE_SIMD_PRNG
+#if FOLLY_HAVE_EXTRANDOM_SFMT19937
 
 template <class UIntType, size_t m, size_t pos1, size_t sl1, size_t sl2,
           size_t sr1, size_t sr2, uint32_t msk1, uint32_t msk2, uint32_t msk3,
@@ -105,23 +107,28 @@ constexpr size_t
 StateSize<std::subtract_with_carry_engine<UIntType, w, s, r>>::value;
 
 template <class RNG>
-std::seed_seq generateSeed() {
-  std::array<uint32_t, StateSize<RNG>::value> seed_data;
-  Random::secureRandom(seed_data.begin(), seed_data.size() * sizeof(uint32_t));
-  return std::seed_seq(std::begin(seed_data), std::end(seed_data));
-}
+struct SeedData {
+  SeedData() {
+    Random::secureRandom(seedData.data(), seedData.size() * sizeof(uint32_t));
+  }
+
+  static constexpr size_t stateSize = StateSize<RNG>::value;
+  std::array<uint32_t, stateSize> seedData;
+};
 
 }  // namespace detail
 
-template <class RNG>
-void Random::seed(ValidRNG<RNG>& rng) {
-  auto s = detail::generateSeed<RNG>();
+template <class RNG, class /* EnableIf */>
+void Random::seed(RNG& rng) {
+  detail::SeedData<RNG> sd;
+  std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData));
   rng.seed(s);
 }
 
-template <class RNG>
-auto Random::create() -> ValidRNG<RNG> {
-  auto s = detail::generateSeed<RNG>();
+template <class RNG, class /* EnableIf */>
+auto Random::create() -> RNG {
+  detail::SeedData<RNG> sd;
+  std::seed_seq s(std::begin(sd.seedData), std::end(sd.seedData));
   return RNG(s);
 }