////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2004-2007. 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/interprocess for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include "allocator_v1.hpp" #include #include #include #include "print_container.hpp" #include "check_equal_containers.hpp" #include "movable_int.hpp" #include "expand_bwd_test_allocator.hpp" #include "expand_bwd_test_template.hpp" #include "dummy_test_allocator.hpp" #include #include "get_process_id_name.hpp" #include using namespace boost::interprocess; typedef basic_managed_shared_memory , flat_map_index > managed_shared_memory_t; //Explicit instantiation to detect compilation errors template class boost::interprocess::vector >; template bool copyable_only(V1 *, V2 *, detail::false_type) { return true; } //Function to check if both sets are equal template bool copyable_only(V1 *shmvector, V2 *stdvector, detail::true_type) { typedef typename V1::value_type IntType; std::size_t size = shmvector->size(); stdvector->insert(stdvector->end(), 50, 1); shmvector->insert(shmvector->end(), 50, 1); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; { IntType move_me(1); stdvector->insert(stdvector->begin()+size/2, 50, 1); shmvector->insert(shmvector->begin()+size/2, 50, move(move_me)); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; } { IntType move_me(2); shmvector->assign(shmvector->size()/2, move(move_me)); stdvector->assign(stdvector->size()/2, 2); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; } { IntType move_me(3); shmvector->assign(shmvector->size()*3-1, move(move_me)); stdvector->assign(stdvector->size()*3-1, 3); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; } return true; } template class AllocatorType > bool do_test() { //Customize managed_shared_memory class typedef basic_managed_shared_memory , rbtree_best_fit, flat_map_index > my_managed_shared_memory; //Alias AllocatorType type typedef AllocatorType shmem_allocator_t; //Alias vector types typedef vector MyShmVector; typedef std::vector MyStdVector; std::string process_name; test::get_process_id_name(process_name); const int Memsize = 65536; const char *const shMemName = process_name.c_str(); const int max = 100; { //Compare several shared memory vector operations with std::vector //Create shared memory shared_memory_object::remove(shMemName); try{ my_managed_shared_memory segment(create_only, shMemName, Memsize); segment.reserve_named_objects(100); //Shared memory allocator must be always be initialized //since it has no default constructor MyShmVector *shmvector = segment.template construct("MyShmVector") (segment.get_segment_manager()); MyStdVector *stdvector = new MyStdVector; shmvector->resize(100); stdvector->resize(100); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; shmvector->resize(200); stdvector->resize(200); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; shmvector->resize(0); stdvector->resize(0); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; for(int i = 0; i < max; ++i){ IntType new_int(i); shmvector->insert(shmvector->end(), move(new_int)); stdvector->insert(stdvector->end(), i); } if(!test::CheckEqualContainers(shmvector, stdvector)) return false; typename MyShmVector::iterator it; typename MyShmVector::const_iterator cit = it; shmvector->erase(boost::next(shmvector->begin())); stdvector->erase(boost::next(stdvector->begin())); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; shmvector->erase(shmvector->begin()); stdvector->erase(stdvector->begin()); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; { //Initialize values IntType aux_vect[50]; for(int i = 0; i < 50; ++i){ IntType new_int(-1); aux_vect[i] = move(new_int); } int aux_vect2[50]; for(int i = 0; i < 50; ++i){ aux_vect2[i] = -1; } shmvector->insert(shmvector->end() ,detail::make_move_iterator(&aux_vect[0]) ,detail::make_move_iterator(aux_vect + 50)); stdvector->insert(stdvector->end(), aux_vect2, aux_vect2 + 50); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; for(int i = 0, j = static_cast(shmvector->size()); i < j; ++i){ shmvector->erase(shmvector->begin()); stdvector->erase(stdvector->begin()); } if(!test::CheckEqualContainers(shmvector, stdvector)) return false; } { IntType aux_vect[50]; for(int i = 0; i < 50; ++i){ IntType new_int(-1); aux_vect[i] = move(new_int); } int aux_vect2[50]; for(int i = 0; i < 50; ++i){ aux_vect2[i] = -1; } shmvector->insert(shmvector->begin() ,detail::make_move_iterator(&aux_vect[0]) ,detail::make_move_iterator(aux_vect + 50)); stdvector->insert(stdvector->begin(), aux_vect2, aux_vect2 + 50); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; } shmvector->reserve(shmvector->size()*2); stdvector->reserve(stdvector->size()*2); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; IntType push_back_this(1); shmvector->push_back(move(push_back_this)); stdvector->push_back(int(1)); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; if(!copyable_only(shmvector, stdvector ,detail::bool_::value>())){ return false; } shmvector->erase(shmvector->begin()); stdvector->erase(stdvector->begin()); if(!test::CheckEqualContainers(shmvector, stdvector)) return false; for(int i = 0; i < max; ++i){ IntType insert_this(i); shmvector->insert(shmvector->begin(), move(insert_this)); stdvector->insert(stdvector->begin(), i); } if(!test::CheckEqualContainers(shmvector, stdvector)) return false; delete stdvector; segment.template destroy("MyShmVector"); segment.shrink_to_fit_indexes(); if(!segment.all_memory_deallocated()) return false; } catch(std::exception &ex){ shared_memory_object::remove(shMemName); std::cout << ex.what() << std::endl; return false; } } shared_memory_object::remove(shMemName); std::cout << std::endl << "Test OK!" << std::endl; return true; } bool test_expand_bwd() { //Now test all back insertion possibilities //First raw ints typedef test::expand_bwd_test_allocator int_allocator_type; typedef vector int_vector; if(!test::test_all_expand_bwd()) return false; //Now user defined wrapped int typedef test::expand_bwd_test_allocator int_holder_allocator_type; typedef vector int_holder_vector; if(!test::test_all_expand_bwd()) return false; //Now user defined bigger wrapped int typedef test::expand_bwd_test_allocator triple_int_holder_allocator_type; typedef vector triple_int_holder_vector; if(!test::test_all_expand_bwd()) return false; return true; } int main() { if(!do_test()) return 1; if(!do_test()) return 1; if(!do_test()) return 1; if(!do_test()) return 1; if(!test_expand_bwd()) return 1; return 0; } #include