1 ////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2006. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/libs/container for documentation.
9 ////////////////////////////////////////
11 #ifndef BOOST_CONTAINER_TEST_LIST_TEST_HEADER
12 #define BOOST_CONTAINER_TEST_LIST_TEST_HEADER
14 #include <boost/container/detail/config_begin.hpp>
15 #include <boost/container/detail/iterator.hpp>
16 #include "check_equal_containers.hpp"
17 #include "print_container.hpp"
18 #include "input_from_forward_iterator.hpp"
19 #include <boost/move/utility_core.hpp>
20 #include <boost/move/iterator.hpp>
21 #include <boost/move/make_unique.hpp>
24 #include <functional> //std::greater
30 template<class V1, class V2>
31 bool list_copyable_only(V1 &, V2 &, boost::container::container_detail::false_type)
36 //Function to check if both sets are equal
37 template<class V1, class V2>
38 bool list_copyable_only(V1 &boostlist, V2 &stdlist, boost::container::container_detail::true_type)
40 typedef typename V1::value_type IntType;
41 boostlist.insert(boostlist.end(), 50, IntType(1));
42 stdlist.insert(stdlist.end(), 50, 1);
43 if(!test::CheckEqualContainers(boostlist, stdlist)) return false;
47 boostlist.insert(boostlist.begin(), 50, boost::move(move_me));
48 stdlist.insert(stdlist.begin(), 50, 1);
49 if(!test::CheckEqualContainers(boostlist, stdlist)) return false;
53 boostlist.assign(boostlist.size()/2, boost::move(move_me));
54 stdlist.assign(stdlist.size()/2, 2);
55 if(!test::CheckEqualContainers(boostlist, stdlist)) return false;
59 boostlist.assign(boostlist.size()*3-1, boost::move(move_me));
60 stdlist.assign(stdlist.size()*3-1, 3);
61 if(!test::CheckEqualContainers(boostlist, stdlist)) return false;
66 const IntType ccopy_me(3);
67 boostlist.push_front(copy_me);
68 stdlist.push_front(int(3));
69 boostlist.push_front(ccopy_me);
70 stdlist.push_front(int(3));
71 if(!test::CheckEqualContainers(boostlist, stdlist)) return false;
73 { //List(const List &)
74 ::boost::movelib::unique_ptr<V1> const pv1 = ::boost::movelib::make_unique<V1>(boostlist);
75 ::boost::movelib::unique_ptr<V2> const pv2 = ::boost::movelib::make_unique<V2>(stdlist);
82 boostlist.assign(v1.begin(), v1.end());
83 stdlist.assign(v2.begin(), v2.end());
84 if(!test::CheckEqualContainers(boostlist, stdlist)) return 1;
86 { //List(const List &, alloc)
87 ::boost::movelib::unique_ptr<V1> const pv1 = ::boost::movelib::make_unique<V1>(boostlist, typename V1::allocator_type());
88 ::boost::movelib::unique_ptr<V2> const pv2 = ::boost::movelib::make_unique<V2>(stdlist);
95 boostlist.assign(v1.begin(), v1.end());
96 stdlist.assign(v2.begin(), v2.end());
97 if(!test::CheckEqualContainers(boostlist, stdlist)) return 1;
103 template<bool DoublyLinked>
104 struct list_push_data_function
106 template<class MyBoostList, class MyStdList>
107 static int execute(int max, MyBoostList &boostlist, MyStdList &stdlist)
109 typedef typename MyBoostList::value_type IntType;
110 for(int i = 0; i < max; ++i){
112 boostlist.push_back(boost::move(move_me));
113 stdlist.push_back(i);
114 boostlist.push_front(IntType(i));
115 stdlist.push_front(int(i));
117 if(!CheckEqualContainers(boostlist, stdlist))
124 struct list_push_data_function<false>
126 template<class MyBoostList, class MyStdList>
127 static int execute(int max, MyBoostList &boostlist, MyStdList &stdlist)
129 typedef typename MyBoostList::value_type IntType;
130 for(int i = 0; i < max; ++i){
132 boostlist.push_front(boost::move(move_me));
133 stdlist.push_front(i);
134 boostlist.push_front(IntType(i));
135 stdlist.push_front(int(i));
137 if(!CheckEqualContainers(boostlist, stdlist))
143 template<bool DoublyLinked>
144 struct list_pop_back_function
146 template<class MyStdList, class MyBoostList>
147 static int execute(MyBoostList &boostlist, MyStdList &stdlist)
149 boostlist.pop_back();
151 if(!CheckEqualContainers(boostlist, stdlist))
158 struct list_pop_back_function<false>
160 template<class MyStdList, class MyBoostList>
161 static int execute(MyBoostList &boostlist, MyStdList &stdlist)
163 (void)boostlist; (void)stdlist;
168 template<class MyBoostList
170 int list_test (bool copied_allocators_equal = true)
172 typedef std::list<int> MyStdList;
173 typedef typename MyBoostList::value_type IntType;
175 typedef list_push_data_function<DoublyLinked> push_data_t;
178 ::boost::movelib::unique_ptr<MyBoostList> const pboostlist = ::boost::movelib::make_unique<MyBoostList>(100);
179 ::boost::movelib::unique_ptr<MyStdList> const pstdlist = ::boost::movelib::make_unique<MyStdList>(100);
180 if(!test::CheckEqualContainers(*pboostlist, *pstdlist)) return 1;
183 ::boost::movelib::unique_ptr<MyBoostList> const pboostlist = ::boost::movelib::make_unique<MyBoostList>(100, typename MyBoostList::allocator_type());
184 ::boost::movelib::unique_ptr<MyStdList> const pstdlist = ::boost::movelib::make_unique<MyStdList>(100);
185 if(!test::CheckEqualContainers(*pboostlist, *pstdlist)) return 1;
188 ::boost::movelib::unique_ptr<MyStdList> const stdlistp = ::boost::movelib::make_unique<MyStdList>(100);
189 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp = ::boost::movelib::make_unique<MyBoostList>(100);
190 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp2 = ::boost::movelib::make_unique<MyBoostList>(::boost::move(*boostlistp));
191 if(!test::CheckEqualContainers(*boostlistp2, *stdlistp)) return 1;
193 { //List(List &&, alloc)
194 ::boost::movelib::unique_ptr<MyStdList> const stdlistp = ::boost::movelib::make_unique<MyStdList>(100);
195 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp = ::boost::movelib::make_unique<MyBoostList>(100);
196 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp2 = ::boost::movelib::make_unique<MyBoostList>
197 (::boost::move(*boostlistp), typename MyBoostList::allocator_type());
198 if(!test::CheckEqualContainers(*boostlistp2, *stdlistp)) return 1;
200 { //List operator=(List &&)
201 ::boost::movelib::unique_ptr<MyStdList> const stdlistp = ::boost::movelib::make_unique<MyStdList>(100);
202 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp = ::boost::movelib::make_unique<MyBoostList>(100);
203 ::boost::movelib::unique_ptr<MyBoostList> const boostlistp2 = ::boost::movelib::make_unique<MyBoostList>();
204 *boostlistp2 = ::boost::move(*boostlistp);
205 if(!test::CheckEqualContainers(*boostlistp2, *stdlistp)) return 1;
208 ::boost::movelib::unique_ptr<MyBoostList> const pboostlist = ::boost::movelib::make_unique<MyBoostList>();
209 ::boost::movelib::unique_ptr<MyStdList> const pstdlist = ::boost::movelib::make_unique<MyStdList>();
211 MyBoostList &boostlist = *pboostlist;
212 MyStdList &stdlist = *pstdlist;
214 if(push_data_t::execute(max, boostlist, stdlist)){
218 boostlist.erase(boostlist.begin()++);
219 stdlist.erase(stdlist.begin()++);
220 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
222 if(list_pop_back_function<DoublyLinked>::execute(boostlist, stdlist)){
226 boostlist.pop_front();
228 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
231 IntType aux_vect[50];
232 for(int i = 0; i < 50; ++i){
234 aux_vect[i] = boost::move(move_me);
237 for(int i = 0; i < 50; ++i){
240 boostlist.assign(boost::make_move_iterator(&aux_vect[0])
241 ,boost::make_move_iterator(&aux_vect[50]));
242 stdlist.assign(&aux_vect2[0], &aux_vect2[50]);
243 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
245 for(int i = 0; i < 50; ++i){
247 aux_vect[i] = boost::move(move_me);
250 for(int i = 0; i < 50; ++i){
253 boostlist.assign(boost::make_move_iterator(make_input_from_forward_iterator(&aux_vect[0]))
254 ,boost::make_move_iterator(make_input_from_forward_iterator(&aux_vect[50])));
255 stdlist.assign(&aux_vect2[0], &aux_vect2[50]);
256 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
259 if(copied_allocators_equal){
262 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
267 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
271 if(!CheckEqualContainers(boostlist, stdlist)) return 1;
274 IntType aux_vect[50];
275 for(int i = 0; i < 50; ++i){
277 aux_vect[i] = boost::move(move_me);
280 for(int i = 0; i < 50; ++i){
283 typename MyBoostList::iterator old_begin = boostlist.begin();
284 typename MyBoostList::iterator it_insert =
285 boostlist.insert(boostlist.begin()
286 ,boost::make_move_iterator(&aux_vect[0])
287 ,boost::make_move_iterator(&aux_vect[50]));
288 if(it_insert != boostlist.begin() || boost::container::iterator_distance(it_insert, old_begin) != 50)
291 stdlist.insert(stdlist.begin(), &aux_vect2[0], &aux_vect2[50]);
292 if(!CheckEqualContainers(boostlist, stdlist))
295 for(int i = 0; i < 50; ++i){
297 aux_vect[i] = boost::move(move_me);
300 for(int i = 0; i < 50; ++i){
304 old_begin = boostlist.begin();
305 it_insert = boostlist.insert(boostlist.end()
306 ,boost::make_move_iterator(make_input_from_forward_iterator(&aux_vect[0]))
307 ,boost::make_move_iterator(make_input_from_forward_iterator(&aux_vect[50])));
308 if(boost::container::iterator_distance(it_insert, boostlist.end()) != 50)
310 stdlist.insert(stdlist.end(), &aux_vect2[0], &aux_vect2[50]);
311 if(!CheckEqualContainers(boostlist, stdlist))
317 if(!CheckEqualContainers(boostlist, stdlist))
320 if(copied_allocators_equal){
321 boostlist.sort(std::greater<IntType>());
322 stdlist.sort(std::greater<int>());
323 if(!CheckEqualContainers(boostlist, stdlist))
327 for(int i = 0; i < max; ++i){
329 boostlist.insert(boostlist.end(), boost::move(new_int));
330 stdlist.insert(stdlist.end(), i);
331 if(!test::CheckEqualContainers(boostlist, stdlist)) return 1;
333 if(!test::CheckEqualContainers(boostlist, stdlist)) return 1;
335 boostlist.resize(25);
337 boostlist.resize(50);
341 if(!CheckEqualContainers(boostlist, stdlist))
344 //some comparison operators
345 if(!(boostlist == boostlist))
347 if(boostlist != boostlist)
349 if(boostlist < boostlist)
351 if(boostlist > boostlist)
353 if(!(boostlist <= boostlist))
355 if(!(boostlist >= boostlist))
358 if(push_data_t::execute(max, boostlist, stdlist)){
362 MyBoostList otherboostlist(boostlist.get_allocator());
363 MyStdList otherstdlist;
365 int listsize = (int)boostlist.size();
367 if(push_data_t::execute(listsize, boostlist, stdlist)){
371 if(copied_allocators_equal){
372 boostlist.splice(boostlist.begin(), otherboostlist);
373 stdlist.splice(stdlist.begin(), otherstdlist);
374 if(!CheckEqualContainers(boostlist, stdlist))
378 listsize = (int)boostlist.size();
380 if(push_data_t::execute(listsize, boostlist, stdlist)){
384 if(push_data_t::execute(listsize, otherboostlist, otherstdlist)){
388 if(copied_allocators_equal){
389 boostlist.sort(std::greater<IntType>());
390 stdlist.sort(std::greater<int>());
391 if(!CheckEqualContainers(boostlist, stdlist))
394 otherboostlist.sort(std::greater<IntType>());
395 otherstdlist.sort(std::greater<int>());
396 if(!CheckEqualContainers(otherboostlist, otherstdlist))
399 boostlist.merge(otherboostlist, std::greater<IntType>());
400 stdlist.merge(otherstdlist, std::greater<int>());
401 if(!CheckEqualContainers(boostlist, stdlist))
405 if(!list_copyable_only(boostlist, stdlist
406 ,container_detail::bool_<boost::container::test::is_copyable<IntType>::value>())){
414 bool test_list_methods_with_initializer_list_as_argument_for()
416 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
417 const std::initializer_list<int> il = {5, 10, 15};
418 const List expected_list(il.begin(), il.end());
421 if(sl != expected_list)
428 if(sl != expected_list)
432 List sl({ 1, 2 }, typename List::allocator_type());
434 if (sl != expected_list)
440 if(sl != expected_list)
446 sl.insert(sl.cbegin(), {5, 10});
447 if(sl != expected_list)
453 sl.insert_after(sl.cbegin(), {10, 15});
454 if(sl != expected_list)
464 } //namespace container {
467 #include <boost/container/detail/config_end.hpp>