random_values.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2005-2009 Daniel James.
  2. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #if !defined(BOOST_UNORDERED_TEST_HELPERS_RANDOM_VALUES_HEADER)
  5. #define BOOST_UNORDERED_TEST_HELPERS_RANDOM_VALUES_HEADER
  6. #include "./generators.hpp"
  7. #include "./list.hpp"
  8. #include "./metafunctions.hpp"
  9. #include <algorithm>
  10. #include <boost/detail/select_type.hpp>
  11. namespace test {
  12. template <class X> struct unordered_generator_set
  13. {
  14. typedef typename X::value_type value_type;
  15. random_generator type_;
  16. unordered_generator_set(random_generator type) : type_(type) {}
  17. template <class T> void fill(T& x, std::size_t len)
  18. {
  19. value_type* value_ptr = 0;
  20. len += x.size();
  21. for (std::size_t i = 0; i < len; ++i) {
  22. value_type value = generate(value_ptr, type_);
  23. std::size_t count =
  24. type_ == generate_collisions ? random_value(5) + 1 : 1;
  25. for (std::size_t j = 0; j < count; ++j) {
  26. x.push_back(value);
  27. }
  28. }
  29. }
  30. };
  31. template <class X> struct unordered_generator_map
  32. {
  33. typedef typename X::key_type key_type;
  34. typedef typename X::mapped_type mapped_type;
  35. random_generator type_;
  36. unordered_generator_map(random_generator type) : type_(type) {}
  37. template <class T> void fill(T& x, std::size_t len)
  38. {
  39. key_type* key_ptr = 0;
  40. mapped_type* mapped_ptr = 0;
  41. for (std::size_t i = 0; i < len; ++i) {
  42. key_type key = generate(key_ptr, type_);
  43. std::size_t count =
  44. type_ == generate_collisions ? random_value(5) + 1 : 1;
  45. for (std::size_t j = 0; j < count; ++j) {
  46. x.push_back(std::pair<key_type const, mapped_type>(
  47. key, generate(mapped_ptr, type_)));
  48. }
  49. }
  50. }
  51. };
  52. template <class X>
  53. struct unordered_generator_base
  54. : public boost::detail::if_true<test::is_set<X>::value>::
  55. BOOST_NESTED_TEMPLATE then<test::unordered_generator_set<X>,
  56. test::unordered_generator_map<X> >
  57. {
  58. };
  59. template <class X>
  60. struct unordered_generator : public unordered_generator_base<X>::type
  61. {
  62. typedef typename unordered_generator_base<X>::type base;
  63. unordered_generator(random_generator const& type = default_generator)
  64. : base(type)
  65. {
  66. }
  67. };
  68. template <class X>
  69. struct random_values : public test::list<typename X::value_type>
  70. {
  71. random_values() {}
  72. explicit random_values(std::size_t count,
  73. test::random_generator const& generator = test::default_generator)
  74. {
  75. fill(count, generator);
  76. }
  77. void fill(std::size_t count,
  78. test::random_generator const& generator = test::default_generator)
  79. {
  80. test::unordered_generator<X> gen(generator);
  81. gen.fill(*this, count);
  82. }
  83. };
  84. }
  85. #endif