list_test.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 271 行

HPP
271
字号
//////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2006. 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_LIST_TEST_HEADER#define BOOST_INTERPROCESS_TEST_LIST_TEST_HEADER#include <boost/interprocess/detail/config_begin.hpp>#include "check_equal_containers.hpp"#include <memory>#include <list>#include <vector>#include <functional>#include "print_container.hpp"#include <boost/interprocess/detail/move.hpp>#include <boost/interprocess/detail/move_iterator.hpp>#include <string>#include "get_process_id_name.hpp"namespace boost{namespace interprocess{namespace test{template<bool DoublyLinked>struct push_data_function{   template<class MyShmList, class MyStdList>   static int execute(int max, MyShmList *shmlist, MyStdList *stdlist)   {      typedef typename MyShmList::value_type IntType;      for(int i = 0; i < max; ++i){         IntType move_me(i);         shmlist->push_back(detail::move_impl(move_me));         stdlist->push_back(i);      }      if(!CheckEqualContainers(shmlist, stdlist))         return 1;      return 0;   }};template<>struct push_data_function<false>{   template<class MyShmList, class MyStdList>   static int execute(int max, MyShmList *shmlist, MyStdList *stdlist)   {      typedef typename MyShmList::value_type IntType;      for(int i = 0; i < max; ++i){         IntType move_me(i);         shmlist->push_front(detail::move_impl(move_me));         stdlist->push_front(i);      }      if(!CheckEqualContainers(shmlist, stdlist))         return 1;      return 0;   }};template<bool DoublyLinked>struct pop_back_function{   template<class MyStdList, class MyShmList>   static int execute(MyShmList *shmlist, MyStdList *stdlist)   {      shmlist->pop_back();      stdlist->pop_back();      if(!CheckEqualContainers(shmlist, stdlist))         return 1;      return 0;   }};template<>struct pop_back_function<false>{   template<class MyStdList, class MyShmList>   static int execute(MyShmList *shmlist, MyStdList *stdlist)   {      (void)shmlist; (void)stdlist;      return 0;   }};template<class ManagedSharedMemory        ,class MyShmList        ,bool  DoublyLinked>int list_test (bool copied_allocators_equal = true){   typedef std::list<int> MyStdList;   typedef typename MyShmList::value_type IntType;   const int memsize = 65536;   const char *const shMemName = test::get_process_id_name();   const int max = 100;   typedef push_data_function<DoublyLinked> push_data_t;   try{      //Named new capable shared mem allocator      //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      MyShmList *shmlist = segment.template construct<MyShmList>("MyList")                              (segment.get_segment_manager());      MyStdList *stdlist = new MyStdList;      if(push_data_t::execute(max, shmlist, stdlist)){         return 1;      }      shmlist->erase(shmlist->begin()++);      stdlist->erase(stdlist->begin()++);      if(!CheckEqualContainers(shmlist, stdlist)) return 1;      if(pop_back_function<DoublyLinked>::execute(shmlist, stdlist)){         return 1;      }      shmlist->pop_front();      stdlist->pop_front();      if(!CheckEqualContainers(shmlist, stdlist)) 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;         }         shmlist->assign(detail::make_move_iterator(&aux_vect[0])                        ,detail::make_move_iterator(&aux_vect[50]));         stdlist->assign(&aux_vect2[0], &aux_vect2[50]);         if(!CheckEqualContainers(shmlist, stdlist)) return 1;      }      if(copied_allocators_equal){         shmlist->sort();         stdlist->sort();         if(!CheckEqualContainers(shmlist, stdlist)) return 1;      }      shmlist->reverse();      stdlist->reverse();      if(!CheckEqualContainers(shmlist, stdlist)) return 1;      shmlist->reverse();      stdlist->reverse();      if(!CheckEqualContainers(shmlist, stdlist)) 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;         }         shmlist->insert(shmlist->begin()                        ,detail::make_move_iterator(&aux_vect[0])                        ,detail::make_move_iterator(&aux_vect[50]));         stdlist->insert(stdlist->begin(), &aux_vect2[0], &aux_vect2[50]);      }      shmlist->unique();      stdlist->unique();      if(!CheckEqualContainers(shmlist, stdlist))         return 1;      if(copied_allocators_equal){         shmlist->sort(std::greater<IntType>());         stdlist->sort(std::greater<int>());         if(!CheckEqualContainers(shmlist, stdlist))            return 1;      }      shmlist->resize(25);      stdlist->resize(25);      shmlist->resize(50);      stdlist->resize(50);      shmlist->resize(0);      stdlist->resize(0);      if(!CheckEqualContainers(shmlist, stdlist))         return 1;      if(push_data_t::execute(max, shmlist, stdlist)){         return 1;      }      {         MyShmList othershmlist(shmlist->get_allocator());         MyStdList otherstdlist;         int listsize = (int)shmlist->size();         if(push_data_t::execute(listsize, shmlist, stdlist)){            return 1;         }         if(copied_allocators_equal){            shmlist->splice(shmlist->begin(), othershmlist);            stdlist->splice(stdlist->begin(), otherstdlist);            if(!CheckEqualContainers(shmlist, stdlist))               return 1;            }         listsize = (int)shmlist->size();         if(push_data_t::execute(listsize, shmlist, stdlist)){            return 1;         }         if(push_data_t::execute(listsize, &othershmlist, &otherstdlist)){            return 1;         }         if(copied_allocators_equal){            shmlist->sort(std::greater<IntType>());            stdlist->sort(std::greater<int>());            if(!CheckEqualContainers(shmlist, stdlist))               return 1;            othershmlist.sort(std::greater<IntType>());            otherstdlist.sort(std::greater<int>());            if(!CheckEqualContainers(&othershmlist, &otherstdlist))               return 1;            shmlist->merge(othershmlist, std::greater<IntType>());            stdlist->merge(otherstdlist, std::greater<int>());            if(!CheckEqualContainers(shmlist, stdlist))               return 1;         }      }      segment.template destroy<MyShmList>("MyList");      delete stdlist;      segment.shrink_to_fit_indexes();      if(!segment.all_memory_deallocated())         return 1;   }   catch(...){      shared_memory_object::remove(shMemName);      throw;   }   shared_memory_object::remove(shMemName);   return 0;}}  //namespace test{}  //namespace interprocess{}  //namespace boost{#include <boost/interprocess/detail/config_end.hpp>#endif

⌨️ 快捷键说明

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