string_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 298 行

CPP
298
字号
////////////////////////////////////////////////////////////////////////////////// (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 <boost/interprocess/detail/config_begin.hpp>#include <boost/interprocess/managed_shared_memory.hpp>#include <boost/interprocess/allocators/allocator.hpp>#include <boost/interprocess/containers/vector.hpp>#include <boost/interprocess/containers/string.hpp>#include <boost/interprocess/offset_ptr.hpp>#include <string>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <cstddef>#include <new>#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"using namespace boost::interprocess;typedef test::dummy_test_allocator<char>           DummyCharAllocator; typedef basic_string<char, std::char_traits<char>, DummyCharAllocator> DummyString;typedef test::dummy_test_allocator<DummyString>    DummyStringAllocator;typedef test::dummy_test_allocator<wchar_t>              DummyWCharAllocator; typedef basic_string<wchar_t, std::char_traits<wchar_t>, DummyWCharAllocator> DummyWString;typedef test::dummy_test_allocator<DummyWString>         DummyWStringAllocator;//Explicit instantiations of interprocess::basic_stringtemplate class basic_string<char, std::char_traits<char>, DummyCharAllocator>;template class basic_string<wchar_t, std::char_traits<wchar_t>, DummyWCharAllocator>;//Explicit instantiation of interprocess::vectors of interprocess::stringstemplate class vector<DummyString, DummyStringAllocator>;template class vector<DummyWString, DummyWStringAllocator>;struct StringEqual{   template<class Str1, class Str2>   bool operator ()(const Str1 &string1, const Str2 &string2) const   {      if(string1.size() != string2.size())         return false;      return std::char_traits<typename Str1::value_type>::compare         (string1.c_str(), string2.c_str(), string1.size()) == 0;   }};//Function to check if both lists are equaltemplate<class StrVector1, class StrVector2>bool CheckEqualStringVector(StrVector1 *strvect1, StrVector2 *strvect2){   StringEqual comp;   return std::equal(strvect1->begin(), strvect1->end(),                      strvect2->begin(), comp);}template<class CharType, template<class T, class SegmentManager> class AllocatorType >int string_test(){   typedef std::allocator<CharType>  StdAllocatorChar;   typedef std::basic_string<CharType, std::char_traits<CharType>, StdAllocatorChar> StdString;   typedef std::allocator<StdString> StdStringAllocator;   typedef vector<StdString, StdStringAllocator> StdStringVector;   typedef AllocatorType<CharType, managed_shared_memory::segment_manager> ShmemAllocatorChar;   typedef basic_string<CharType, std::char_traits<CharType>, ShmemAllocatorChar> ShmString;   typedef AllocatorType<ShmString, managed_shared_memory::segment_manager> ShmemStringAllocator;   typedef vector<ShmString, ShmemStringAllocator> 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<ShmStringVector>                                 (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(detail::move_impl(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(), detail::move_impl(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<char>      allocator_type;   typedef basic_string<char, std::char_traits<char>, allocator_type>      string_type;   return  test::test_all_expand_bwd<string_type>();}int main(){   if(string_test<char, allocator>()){      return 1;   }   if(string_test<char, test::allocator_v1>()){      return 1;   }   if(!test_expand_bwd())      return 1;   return 0;}#include <boost/interprocess/detail/config_end.hpp>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?