////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2004-2012. 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 #include "dummy_test_allocator.hpp" #include "check_equal_containers.hpp" #include "expand_bwd_test_allocator.hpp" #include "expand_bwd_test_template.hpp" #include "allocator_v1.hpp" #include "get_process_id_name.hpp" #include //std::nothrow using namespace boost::interprocess; typedef test::dummy_test_allocator DummyCharAllocator; typedef basic_string, DummyCharAllocator> DummyString; typedef test::dummy_test_allocator DummyStringAllocator; typedef test::dummy_test_allocator DummyWCharAllocator; typedef basic_string, DummyWCharAllocator> DummyWString; typedef test::dummy_test_allocator DummyWStringAllocator; struct StringEqual { template bool operator ()(const Str1 &string1, const Str2 &string2) const { if(string1.size() != string2.size()) return false; return std::char_traits::compare (string1.c_str(), string2.c_str(), (std::size_t)string1.size()) == 0; } }; //Function to check if both lists are equal template bool CheckEqualStringVector(StrVector1 *strvect1, StrVector2 *strvect2) { StringEqual comp; return std::equal(strvect1->begin(), strvect1->end(), strvect2->begin(), comp); } template class AllocatorType > int string_test() { typedef std::allocator StdAllocatorChar; typedef std::basic_string, StdAllocatorChar> StdString; typedef std::allocator StdStringAllocator; typedef vector StdStringVector; typedef AllocatorType ShmemAllocatorChar; typedef basic_string, ShmemAllocatorChar> ShmString; typedef AllocatorType ShmemStringAllocator; typedef vector ShmStringVector; const int MaxSize = 100; std::string process_name; test::get_process_id_name(process_name); //Create shared memory shared_memory_object::remove(process_name.c_str()); { managed_shared_memory segment (create_only, process_name.c_str(),//segment name 65536); //segment size in bytes ShmemAllocatorChar shmallocator (segment.get_segment_manager()); //Initialize vector with a range or iterators and allocator ShmStringVector *shmStringVect = segment.construct (anonymous_instance, std::nothrow) //object name (shmallocator); StdStringVector *stdStringVect = new StdStringVector; ShmString auxShmString (segment.get_segment_manager()); StdString auxStdString(StdString(auxShmString.begin(), auxShmString.end() )); CharType buffer [20]; //First, push back for(int i = 0; i < MaxSize; ++i){ auxShmString = "String"; auxStdString = "String"; std::sprintf(buffer, "%i", i); auxShmString += buffer; auxStdString += buffer; shmStringVect->push_back(auxShmString); stdStringVect->push_back(auxStdString); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)){ return 1; } //Now push back moving for(int i = 0; i < MaxSize; ++i){ auxShmString = "String"; auxStdString = "String"; std::sprintf(buffer, "%i", i); auxShmString += buffer; auxStdString += buffer; shmStringVect->push_back(boost::move(auxShmString)); stdStringVect->push_back(auxStdString); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)){ return 1; } //push front for(int i = 0; i < MaxSize; ++i){ auxShmString = "String"; auxStdString = "String"; std::sprintf(buffer, "%i", i); auxShmString += buffer; auxStdString += buffer; shmStringVect->insert(shmStringVect->begin(), auxShmString); stdStringVect->insert(stdStringVect->begin(), auxStdString); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)){ return 1; } //Now push front moving for(int i = 0; i < MaxSize; ++i){ auxShmString = "String"; auxStdString = "String"; std::sprintf(buffer, "%i", i); auxShmString += buffer; auxStdString += buffer; shmStringVect->insert(shmStringVect->begin(), boost::move(auxShmString)); stdStringVect->insert(stdStringVect->begin(), auxStdString); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)){ return 1; } //Now test long and short representation swapping auxShmString = "String"; auxStdString = "String"; ShmString shm_swapper(segment.get_segment_manager()); StdString std_swapper; shm_swapper.swap(auxShmString); std_swapper.swap(auxStdString); if(!StringEqual()(auxShmString, auxStdString)) return 1; if(!StringEqual()(shm_swapper, std_swapper)) return 1; shm_swapper.swap(auxShmString); std_swapper.swap(auxStdString); if(!StringEqual()(auxShmString, auxStdString)) return 1; if(!StringEqual()(shm_swapper, std_swapper)) return 1; auxShmString = "LongLongLongLongLongLongLongLongLongLongLongLongLongString"; auxStdString = "LongLongLongLongLongLongLongLongLongLongLongLongLongString"; shm_swapper = ShmString (segment.get_segment_manager()); std_swapper = StdString (); shm_swapper.swap(auxShmString); std_swapper.swap(auxStdString); if(!StringEqual()(auxShmString, auxStdString)) return 1; if(!StringEqual()(shm_swapper, std_swapper)) return 1; shm_swapper.swap(auxShmString); std_swapper.swap(auxStdString); if(!StringEqual()(auxShmString, auxStdString)) return 1; if(!StringEqual()(shm_swapper, std_swapper)) return 1; //No sort std::sort(shmStringVect->begin(), shmStringVect->end()); std::sort(stdStringVect->begin(), stdStringVect->end()); if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; const CharType prefix [] = "Prefix"; const int prefix_size = sizeof(prefix)/sizeof(prefix[0])-1; const CharType sufix [] = "Suffix"; for(int i = 0; i < MaxSize; ++i){ (*shmStringVect)[i].append(sufix); (*stdStringVect)[i].append(sufix); (*shmStringVect)[i].insert((*shmStringVect)[i].begin(), prefix, prefix + prefix_size); (*stdStringVect)[i].insert((*stdStringVect)[i].begin(), prefix, prefix + prefix_size); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; for(int i = 0; i < MaxSize; ++i){ std::reverse((*shmStringVect)[i].begin(), (*shmStringVect)[i].end()); std::reverse((*stdStringVect)[i].begin(), (*stdStringVect)[i].end()); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; for(int i = 0; i < MaxSize; ++i){ std::reverse((*shmStringVect)[i].begin(), (*shmStringVect)[i].end()); std::reverse((*stdStringVect)[i].begin(), (*stdStringVect)[i].end()); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; for(int i = 0; i < MaxSize; ++i){ std::sort(shmStringVect->begin(), shmStringVect->end()); std::sort(stdStringVect->begin(), stdStringVect->end()); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; for(int i = 0; i < MaxSize; ++i){ (*shmStringVect)[i].replace((*shmStringVect)[i].begin(), (*shmStringVect)[i].end(), "String"); (*stdStringVect)[i].replace((*stdStringVect)[i].begin(), (*stdStringVect)[i].end(), "String"); } if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; shmStringVect->erase(std::unique(shmStringVect->begin(), shmStringVect->end()), shmStringVect->end()); stdStringVect->erase(std::unique(stdStringVect->begin(), stdStringVect->end()), stdStringVect->end()); if(!CheckEqualStringVector(shmStringVect, stdStringVect)) return 1; //When done, delete vector segment.destroy_ptr(shmStringVect); delete stdStringVect; } shared_memory_object::remove(process_name.c_str()); return 0; } bool test_expand_bwd() { //Now test all back insertion possibilities typedef test::expand_bwd_test_allocator allocator_type; typedef basic_string, allocator_type> string_type; return test::test_all_expand_bwd(); } int main() { if(string_test()){ return 1; } if(string_test()){ return 1; } if(!test_expand_bwd()) return 1; return 0; } #include