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����������������������������... 下载