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