[Groonga-commit] groonga/grnxx at 3a4a3e8 [master] Fix a bug of inserting NaN to std::unordered_set.

Back to archive index

susumu.yata null+****@clear*****
Thu May 30 00:09:50 JST 2013


susumu.yata	2013-05-30 00:09:50 +0900 (Thu, 30 May 2013)

  New Revision: 3a4a3e83f789be1e237115d73f0fcbc6faa04c11
  https://github.com/groonga/grnxx/commit/3a4a3e83f789be1e237115d73f0fcbc6faa04c11

  Message:
    Fix a bug of inserting NaN to std::unordered_set.

  Modified files:
    test/test_map.cpp

  Modified: test/test_map.cpp (+25 -1)
===================================================================
--- test/test_map.cpp    2013-05-29 23:43:21 +0900 (da0d562)
+++ test/test_map.cpp    2013-05-30 00:09:50 +0900 (e679f7e)
@@ -46,7 +46,8 @@ constexpr std::uint64_t MAP_NUM_KEYS         = 100;
 constexpr std::uint64_t BYTES_STORE_NUM_KEYS = 1 << 14;
 
 std::random_device random_device;
-std::mt19937_64 mersenne_twister(random_device());
+std::uint64_t mersenne_twister_seed = random_device();
+std::mt19937_64 mersenne_twister(mersenne_twister_seed);
 
 // For std::unordered_set.
 template <typename T>
@@ -112,6 +113,27 @@ void generate_random_keys(std::uint64_t num_keys, std::vector<T> *keys) {
   *keys = std::vector<T>(keyset.begin(), keyset.end());
   std::random_shuffle(keys->begin(), keys->end(), RandomNumberGenerator());
 }
+// Generate random floating point keys.
+template <>
+void generate_random_keys<double>(std::uint64_t num_keys,
+                                  std::vector<double> *keys) {
+  std::unordered_set<double, Hash<double>> keyset;
+  bool contains_nan = false;
+  while ((keyset.size() + (contains_nan ? 1 : 0)) < num_keys) {
+    const double key = generate_random_key<double>();
+    if (std::isnan(key)) {
+      contains_nan = true;
+    } else {
+      keyset.insert(key);
+    }
+  }
+  *keys = std::vector<double>(keyset.begin(), keyset.end());
+  if (contains_nan) {
+    keys->insert(keys->begin() + (mersenne_twister() % keys->size()),
+                 std::numeric_limits<double>::quiet_NaN());
+  }
+  std::random_shuffle(keys->begin(), keys->end(), RandomNumberGenerator());
+}
 // Generate random keys and those are valid until the next call.
 template <>
 void generate_random_keys(std::uint64_t num_keys,
@@ -996,6 +1018,8 @@ int main() {
   // FIXME: Increment the reference count for grnxx::PeriodicClock.
   grnxx::PeriodicClock clock;
 
+  GRNXX_NOTICE() << "mersenne_twister_seed = " << mersenne_twister_seed;
+
   test_bytes_store();
   test_bytes_array();
   test_map();
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index