2 // Copyright 2006-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)
6 #include "./containers.hpp"
8 #include "../helpers/invariants.hpp"
9 #include "../helpers/random_values.hpp"
10 #include "../helpers/tracker.hpp"
12 #if defined(BOOST_MSVC)
13 #pragma warning(disable : 4512) // assignment operator could not be generated
16 test::seed_t
initialize_seed(12847);
18 template <class T
> struct self_assign_base
: public test::exception_base
20 test::random_values
<T
> values
;
21 self_assign_base(std::size_t count
= 0) : values(count
, test::limited_range
)
26 T
init() const { return T(values
.begin(), values
.end()); }
33 test::check_container(x
, values
);
34 test::check_equivalent_keys(x
);
37 void check
BOOST_PREVENT_MACRO_SUBSTITUTION(T
const& x
) const
39 test::check_equivalent_keys(x
);
43 template <class T
> struct self_assign_test1
: self_assign_base
<T
>
47 template <class T
> struct self_assign_test2
: self_assign_base
<T
>
49 self_assign_test2() : self_assign_base
<T
>(100) {}
52 template <class T
> struct assign_base
: public test::exception_base
54 test::random_values
<T
> x_values
, y_values
;
57 typedef BOOST_DEDUCED_TYPENAME
T::hasher hasher
;
58 typedef BOOST_DEDUCED_TYPENAME
T::key_equal key_equal
;
59 typedef BOOST_DEDUCED_TYPENAME
T::allocator_type allocator_type
;
61 assign_base(int tag1
, int tag2
, float mlf1
= 1.0, float mlf2
= 1.0)
62 : x_values(), y_values(),
63 x(0, hasher(tag1
), key_equal(tag1
), allocator_type(tag1
)),
64 y(0, hasher(tag2
), key_equal(tag2
), allocator_type(tag2
))
66 x
.max_load_factor(mlf1
);
67 y
.max_load_factor(mlf2
);
71 T
init() const { return T(x
); }
78 test::check_container(x1
, y_values
);
79 test::check_equivalent_keys(x1
);
82 void check
BOOST_PREVENT_MACRO_SUBSTITUTION(T
const& x1
) const
84 test::check_equivalent_keys(x1
);
86 // If the container is empty at the point of the exception, the
87 // internal structure is hidden, this exposes it, at the cost of
88 // messing up the data.
89 if (x_values
.size()) {
90 T
& x2
= const_cast<T
&>(x1
);
91 x2
.emplace(*x_values
.begin());
92 test::check_equivalent_keys(x2
);
97 template <class T
> struct assign_values
: assign_base
<T
>
99 assign_values(unsigned int count1
, unsigned int count2
, int tag1
, int tag2
,
100 test::random_generator gen
= test::default_generator
, float mlf1
= 1.0,
102 : assign_base
<T
>(tag1
, tag2
, mlf1
, mlf2
)
104 this->x_values
.fill(count1
, gen
);
105 this->y_values
.fill(count2
, gen
);
106 this->x
.insert(this->x_values
.begin(), this->x_values
.end());
107 this->y
.insert(this->y_values
.begin(), this->y_values
.end());
111 template <class T
> struct assign_test1
: assign_values
<T
>
113 assign_test1() : assign_values
<T
>(0, 0, 0, 0) {}
116 template <class T
> struct assign_test2
: assign_values
<T
>
118 assign_test2() : assign_values
<T
>(60, 0, 0, 0) {}
121 template <class T
> struct assign_test2a
: assign_values
<T
>
123 assign_test2a() : assign_values
<T
>(60, 0, 0, 0, test::limited_range
) {}
126 template <class T
> struct assign_test3
: assign_values
<T
>
128 assign_test3() : assign_values
<T
>(0, 60, 0, 0) {}
131 template <class T
> struct assign_test3a
: assign_values
<T
>
133 assign_test3a() : assign_values
<T
>(0, 60, 0, 0, test::limited_range
) {}
136 template <class T
> struct assign_test4
: assign_values
<T
>
138 assign_test4() : assign_values
<T
>(10, 10, 1, 2) {}
141 template <class T
> struct assign_test4a
: assign_values
<T
>
143 assign_test4a() : assign_values
<T
>(10, 100, 1, 2) {}
146 template <class T
> struct assign_test4b
: assign_values
<T
>
148 assign_test4b() : assign_values
<T
>(10, 100, 1, 2, test::limited_range
) {}
151 template <class T
> struct assign_test5
: assign_values
<T
>
154 : assign_values
<T
>(5, 60, 0, 0, test::default_generator
, 1.0f
, 0.1f
)
159 template <class T
> struct equivalent_test1
: assign_base
<T
>
161 equivalent_test1() : assign_base
<T
>(0, 0)
163 test::random_values
<T
> x_values2(10);
164 this->x_values
.insert(x_values2
.begin(), x_values2
.end());
165 this->x_values
.insert(x_values2
.begin(), x_values2
.end());
166 test::random_values
<T
> y_values2(10);
167 this->y_values
.insert(y_values2
.begin(), y_values2
.end());
168 this->y_values
.insert(y_values2
.begin(), y_values2
.end());
169 this->x
.insert(this->x_values
.begin(), this->x_values
.end());
170 this->y
.insert(this->y_values
.begin(), this->y_values
.end());
175 EXCEPTION_TESTS_REPEAT(5,
176 (self_assign_test1
)(self_assign_test2
)
177 (assign_test1
)(assign_test2
)(assign_test2a
)
178 (assign_test3
)(assign_test3a
)
179 (assign_test4
)(assign_test4a
)(assign_test4b
)