////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2004-2013. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/container for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include "dummy_test_allocator.hpp" #include "movable_int.hpp" #include "list_test.hpp" #include "propagate_allocator_test.hpp" #include "emplace_test.hpp" #include "../../intrusive/test/iterator_test.hpp" using namespace boost::container; class recursive_slist { public: int id_; slist slist_; slist::iterator it_; slist::const_iterator cit_; recursive_slist &operator=(const recursive_slist &o) { slist_ = o.slist_; return *this; } }; void recursive_slist_test()//Test for recursive types { slist recursive_list_list; } template struct GetAllocatorCont { template struct apply { typedef slist< ValueType , typename allocator_traits ::template portable_rebind_alloc::type > type; }; }; bool test_support_for_initializer_list() { #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) const std::initializer_list il = {5, 10, 15}; const slist expected_list(il.begin(), il.end()); { slist sl = il; if(sl != expected_list) return false; } { slist sl = {1, 2}; sl = il; if(sl != expected_list) return false; } { slist sl({ 1, 2 }, slist::allocator_type()); sl = il; if (sl != expected_list) return false; } { slist sl = {4, 5}; sl.assign(il); if(sl != expected_list) return false; } { slist sl = {15}; sl.insert(sl.cbegin(), {5, 10}); if(sl != expected_list) return false; } { slist sl = {5}; sl.insert_after(sl.cbegin(), {10, 15}); if(sl != expected_list) return false; } return true; #endif return true; } bool test_for_splice() { { slist list1; list1.push_front(3); list1.push_front(2); list1.push_front(1); list1.push_front(0); slist list2; slist expected1; expected1.push_front(3); expected1.push_front(2); expected1.push_front(0); slist expected2; expected2.push_front(1); list2.splice(list2.begin(), list1, ++list1.begin()); if (!(expected1 == list1 && expected2 == list2)) return false; } { slist list1; list1.push_front(3); list1.push_front(2); list1.push_front(1); list1.push_front(0); slist list2; slist expected1; slist expected2; expected2.push_front(3); expected2.push_front(2); expected2.push_front(1); expected2.push_front(0); list2.splice(list2.begin(), list1, list1.begin(), list1.end()); if (!(expected1 == list1 && expected2 == list2)) return false; } return true; } struct boost_container_slist; namespace boost { namespace container { namespace test { template<> struct alloc_propagate_base { template struct apply { typedef boost::container::slist type; }; }; }}} int main () { recursive_slist_test(); { //Now test move semantics slist original; slist move_ctor(boost::move(original)); slist move_assign; move_assign = boost::move(move_ctor); move_assign.swap(original); { slist recursive, copy; //Test to test both move emulations if(!copy.size()){ copy = recursive; } } } //////////////////////////////////// // Testing allocator implementations //////////////////////////////////// if (test::list_test >, false>()) return 1; if (test::list_test, false>()) return 1; if (test::list_test >, false>()) return 1; if (test::list_test, false>()) return 1; if (test::list_test, false>()) return 1; if (test::list_test, false>()) return 1; //////////////////////////////////// // Emplace testing //////////////////////////////////// const test::EmplaceOptions Options = (test::EmplaceOptions) (test::EMPLACE_FRONT | test::EMPLACE_AFTER | test::EMPLACE_BEFORE | test::EMPLACE_AFTER); if(!boost::container::test::test_emplace < slist, Options>()) return 1; //////////////////////////////////// // Allocator propagation testing //////////////////////////////////// if(!boost::container::test::test_propagate_allocator()) return 1; //////////////////////////////////// // Initializer lists //////////////////////////////////// if(!test_support_for_initializer_list()) return 1; //////////////////////////////////// // Splice testing //////////////////////////////////// if(!test_for_splice()) return 1; //////////////////////////////////// // Iterator testing //////////////////////////////////// { typedef boost::container::slist vector_int; vector_int a; a.push_front(2); a.push_front(1); a.push_front(0); boost::intrusive::test::test_iterator_forward< boost::container::slist >(a); if(boost::report_errors() != 0) { return 1; } } #ifndef BOOST_CONTAINER_NO_CXX17_CTAD //////////////////////////////////// // Constructor Template Auto Deduction Tests //////////////////////////////////// { auto gold = std::list{ 1, 2, 3 }; auto test = boost::container::slist(gold.begin(), gold.end()); if (test.size() != 3) { return 1; } if (test.front() != 1) return 1; test.pop_front(); if (test.front() != 2) return 1; test.pop_front(); if (test.front() != 3) return 1; test.pop_front(); } { auto gold = std::list{ 1, 2, 3 }; auto test = boost::container::slist(gold.begin(), gold.end(), new_allocator()); if (test.size() != 3) { return 1; } if (test.front() != 1) return 1; test.pop_front(); if (test.front() != 2) return 1; test.pop_front(); if (test.front() != 3) return 1; test.pop_front(); } #endif //////////////////////////////////// // has_trivial_destructor_after_move testing //////////////////////////////////// // default allocator { typedef boost::container::slist cont; typedef cont::allocator_type allocator_type; typedef boost::container::allocator_traits::pointer pointer; if (boost::has_trivial_destructor_after_move::value != boost::has_trivial_destructor_after_move::value && boost::has_trivial_destructor_after_move::value) { std::cerr << "has_trivial_destructor_after_move(default allocator) test failed" << std::endl; return 1; } } // std::allocator { typedef boost::container::slist > cont; typedef cont::allocator_type allocator_type; typedef boost::container::allocator_traits::pointer pointer; if (boost::has_trivial_destructor_after_move::value != boost::has_trivial_destructor_after_move::value && boost::has_trivial_destructor_after_move::value) { std::cerr << "has_trivial_destructor_after_move(std::allocator) test failed" << std::endl; return 1; } } return 0; } #include