set_test.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 521 行 · 第 1/2 页

HPP
521
字号
//////////////////////////////////////////// (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.//////////////////////////////////////////#ifndef BOOST_INTERPROCESS_TEST_SET_TEST_HEADER#define BOOST_INTERPROCESS_TEST_SET_TEST_HEADER#include <boost/interprocess/detail/config_begin.hpp>#include "check_equal_containers.hpp"#include <memory>#include <set>#include <functional>#include "print_container.hpp"#include <boost/interprocess/detail/move_iterator.hpp>#include <string>#include "get_process_id_name.hpp"namespace boost{namespace interprocess{namespace test{template<class ManagedSharedMemory        ,class MyShmSet        ,class MyStdSet        ,class MyShmMultiSet        ,class MyStdMultiSet>int set_test (){   typedef typename MyShmSet::value_type IntType;   const int memsize = 65536;   const char *const shMemName = test::get_process_id_name();   const int max = 100;   try{      //Create shared memory      shared_memory_object::remove(shMemName);      ManagedSharedMemory segment(create_only, shMemName, memsize);      segment.reserve_named_objects(100);      //Shared memory allocator must be always be initialized      //since it has no default constructor      MyShmSet *shmset =          segment.template construct<MyShmSet>("MyShmSet")            (std::less<IntType>(), segment.get_segment_manager());      MyStdSet *stdset = new MyStdSet;      MyShmMultiSet *shmmultiset =          segment.template construct<MyShmMultiSet>("MyShmMultiSet")            (std::less<IntType>(), segment.get_segment_manager());      MyStdMultiSet *stdmultiset = new MyStdMultiSet;      //Test construction from a range         {         IntType aux_vect[50];         for(int i = 0; i < 50; ++i){            IntType move_me(i/2);            aux_vect[i] = detail::move_impl(move_me);         }         int aux_vect2[50];         for(int i = 0; i < 50; ++i){            aux_vect2[i] = i/2;         }         IntType aux_vect3[50];         for(int i = 0; i < 50; ++i){            IntType move_me(i/2);            aux_vect3[i] = detail::move_impl(move_me);         }         MyShmSet *shmset2 =             segment.template construct<MyShmSet>("MyShmSet2")               (detail::make_move_iterator(&aux_vect[0])               , detail::make_move_iterator(aux_vect + 50)               , std::less<IntType>(), segment.get_segment_manager());         MyStdSet *stdset2 = new MyStdSet(aux_vect2, aux_vect2 + 50);         MyShmMultiSet *shmmultiset2 =             segment.template construct<MyShmMultiSet>("MyShmMultiSet2")               (detail::make_move_iterator(&aux_vect3[0])               , detail::make_move_iterator(aux_vect3 + 50)               , std::less<IntType>(), segment.get_segment_manager());         MyStdMultiSet *stdmultiset2 = new MyStdMultiSet(aux_vect2, aux_vect2 + 50);         if(!CheckEqualContainers(shmset2, stdset2)){            std::cout << "Error in construct<MyShmSet>(MyShmSet2)" << std::endl;            return 1;         }         if(!CheckEqualContainers(shmmultiset2, stdmultiset2)){            std::cout << "Error in construct<MyShmMultiSet>(MyShmMultiSet2)" << std::endl;            return 1;         }         segment.destroy_ptr(shmset2);         segment.destroy_ptr(shmmultiset2);         delete stdset2;         delete stdmultiset2;      }      int i, j;      for(i = 0; i < max; ++i){         IntType move_me(i);         shmset->insert(detail::move_impl(move_me));         stdset->insert(i);         IntType move_me2(i);         shmmultiset->insert(detail::move_impl(move_me2));         stdmultiset->insert(i);      }      if(!CheckEqualContainers(shmset, stdset)){         std::cout << "Error in shmset->insert(detail::move_impl(move_me)" << std::endl;         return 1;      }      if(!CheckEqualContainers(shmmultiset, stdmultiset)){         std::cout << "Error in shmmultiset->insert(detail::move_impl(move_me)" << std::endl;         return 1;      }      typename MyShmSet::iterator it;      typename MyShmSet::const_iterator cit = it;      shmset->erase(shmset->begin()++);      stdset->erase(stdset->begin()++);      shmmultiset->erase(shmmultiset->begin()++);      stdmultiset->erase(stdmultiset->begin()++);      if(!CheckEqualContainers(shmset, stdset)){         std::cout << "Error in shmset->erase(shmset->begin()++)" << std::endl;         return 1;      }      if(!CheckEqualContainers(shmmultiset, stdmultiset)){         std::cout << "Error in shmmultiset->erase(shmmultiset->begin()++)" << std::endl;         return 1;      }      shmset->erase(shmset->begin());      stdset->erase(stdset->begin());      shmmultiset->erase(shmmultiset->begin());      stdmultiset->erase(stdmultiset->begin());      if(!CheckEqualContainers(shmset, stdset)){         std::cout << "Error in shmset->erase(shmset->begin())" << std::endl;         return 1;      }      if(!CheckEqualContainers(shmmultiset, stdmultiset)){         std::cout << "Error in shmmultiset->erase(shmmultiset->begin())" << std::endl;         return 1;      }      //Swapping test      std::less<IntType> lessfunc;      MyShmSet tmpshmeset2 (lessfunc, segment.get_segment_manager());      MyStdSet tmpstdset2;      MyShmMultiSet tmpshmemultiset2(lessfunc, segment.get_segment_manager());      MyStdMultiSet tmpstdmultiset2;      shmset->swap(tmpshmeset2);      stdset->swap(tmpstdset2);      shmmultiset->swap(tmpshmemultiset2);      stdmultiset->swap(tmpstdmultiset2);      shmset->swap(tmpshmeset2);      stdset->swap(tmpstdset2);      shmmultiset->swap(tmpshmemultiset2);      stdmultiset->swap(tmpstdmultiset2);      if(!CheckEqualContainers(shmset, stdset)){         std::cout << "Error in shmset->swap(tmpshmeset2)" << std::endl;         return 1;      }      if(!CheckEqualContainers(shmmultiset, stdmultiset)){         std::cout << "Error in shmmultiset->swap(tmpshmemultiset2)" << std::endl;         return 1;      }      //Insertion from other container      //Initialize values      {         IntType aux_vect[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect[i] = detail::move_impl(move_me);         }         int aux_vect2[50];         for(int i = 0; i < 50; ++i){            aux_vect2[i] = -1;         }         IntType aux_vect3[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect3[i] = detail::move_impl(move_me);         }         shmset->insert(detail::make_move_iterator(&aux_vect[0]), detail::make_move_iterator(aux_vect + 50));         stdset->insert(aux_vect2, aux_vect2 + 50);         shmmultiset->insert(detail::make_move_iterator(&aux_vect3[0]), detail::make_move_iterator(aux_vect3 + 50));         stdmultiset->insert(aux_vect2, aux_vect2 + 50);         if(!CheckEqualContainers(shmset, stdset)){            std::cout << "Error in shmset->insert(detail::make_move_iterator(&aux_vect[0])..." << std::endl;            return 1;         }         if(!CheckEqualContainers(shmmultiset, stdmultiset)){            std::cout << "Error in shmmultiset->insert(detail::make_move_iterator(&aux_vect3[0]), ..." << std::endl;            return 1;         }         for(int i = 0, j = static_cast<int>(shmset->size()); i < j; ++i){            IntType erase_me(i);            shmset->erase(erase_me);            stdset->erase(i);            shmmultiset->erase(erase_me);            stdmultiset->erase(i);            if(!CheckEqualContainers(shmset, stdset)){               std::cout << "Error in shmset->erase(erase_me)" << shmset->size() << " " << stdset->size() << std::endl;               return 1;            }            if(!CheckEqualContainers(shmmultiset, stdmultiset)){               std::cout << "Error in shmmultiset->erase(erase_me)" << std::endl;               return 1;            }         }      }      {         IntType aux_vect[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect[i] = detail::move_impl(move_me);         }         int aux_vect2[50];         for(int i = 0; i < 50; ++i){            aux_vect2[i] = -1;         }         IntType aux_vect3[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect3[i] = detail::move_impl(move_me);         }         IntType aux_vect4[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect4[i] = detail::move_impl(move_me);         }         IntType aux_vect5[50];         for(int i = 0; i < 50; ++i){            IntType move_me(-1);            aux_vect5[i] = detail::move_impl(move_me);         }         shmset->insert(detail::make_move_iterator(&aux_vect[0]), detail::make_move_iterator(aux_vect + 50));         shmset->insert(detail::make_move_iterator(&aux_vect3[0]), detail::make_move_iterator(aux_vect3 + 50));         stdset->insert(aux_vect2, aux_vect2 + 50);         stdset->insert(aux_vect2, aux_vect2 + 50);         shmmultiset->insert(detail::make_move_iterator(&aux_vect4[0]), detail::make_move_iterator(aux_vect4 + 50));         shmmultiset->insert(detail::make_move_iterator(&aux_vect5[0]), detail::make_move_iterator(aux_vect5 + 50));         stdmultiset->insert(aux_vect2, aux_vect2 + 50);

⌨️ 快捷键说明

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