user_buffer_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 243 行
CPP
243 行
////////////////////////////////////////////////////////////////////////////////// (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 <algorithm>#include <vector>#include <list>#include <iostream>#include <functional>#include <boost/interprocess/managed_external_buffer.hpp>#include <boost/interprocess/managed_heap_memory.hpp>#include <boost/interprocess/containers/list.hpp>#include <boost/interprocess/detail/type_traits.hpp>#include <boost/interprocess/allocators/node_allocator.hpp>#include "print_container.hpp"/******************************************************************************//* *//* This example constructs repeats the same operations with std::list, *//* shmem_list in user provided buffer, and shmem_list in heap memory *//* *//******************************************************************************/using namespace boost::interprocess;//We will work with wide characters for user memory objects//Alias <integer> node allocator typetypedef node_allocator <int, wmanaged_external_buffer::segment_manager> user_node_allocator_t;typedef node_allocator <int, wmanaged_heap_memory::segment_manager> heap_node_allocator_t;//Alias list typestypedef list<int, user_node_allocator_t> MyUserList;typedef list<int, heap_node_allocator_t> MyHeapList;typedef std::list<int> MyStdList;//Function to check if both lists are equalbool CheckEqual(MyUserList *userlist, MyStdList *stdlist, MyHeapList *heaplist){ return std::equal(userlist->begin(), userlist->end(), stdlist->begin()) && std::equal(heaplist->begin(), heaplist->end(), stdlist->begin());}int main (){ //Create the user memory who will store all objects const int size_aligner = sizeof(detail::max_align); const int memsize = 65536/size_aligner*size_aligner; static detail::max_align static_buffer[memsize/size_aligner]; //Named new capable user mem allocator wmanaged_external_buffer user_buffer(create_only, static_buffer, memsize); //Named new capable heap mem allocator wmanaged_heap_memory heap_buffer(memsize); //Test move semantics { wmanaged_external_buffer user_default; wmanaged_external_buffer temp_external(detail::move_impl(user_buffer)); user_default = detail::move_impl(temp_external); user_buffer = detail::move_impl(user_default); wmanaged_heap_memory heap_default; wmanaged_heap_memory temp_heap(detail::move_impl(heap_buffer)); heap_default = detail::move_impl(temp_heap); heap_buffer = detail::move_impl(heap_default); } //Initialize memory user_buffer.reserve_named_objects(100); heap_buffer.reserve_named_objects(100); //User memory allocator must be always be initialized //since it has no default constructor MyUserList *userlist = user_buffer.construct<MyUserList>(L"MyUserList") (user_buffer.get_segment_manager()); MyHeapList *heaplist = heap_buffer.construct<MyHeapList>(L"MyHeapList") (heap_buffer.get_segment_manager()); //Alias heap list typedef std::list<int> MyStdList; MyStdList *stdlist = new MyStdList; int i; const int max = 100; for(i = 0; i < max; ++i){ userlist->push_back(i); heaplist->push_back(i); stdlist->push_back(i); } if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->erase(userlist->begin()++); heaplist->erase(heaplist->begin()++); stdlist->erase(stdlist->begin()++); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->pop_back(); heaplist->pop_back(); stdlist->pop_back(); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->pop_front(); heaplist->pop_front(); stdlist->pop_front(); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; std::vector<int> aux_vect; #if !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) aux_vect.assign(50, -1); userlist->assign(aux_vect.begin(), aux_vect.end()); heaplist->assign(aux_vect.begin(), aux_vect.end()); stdlist->assign(aux_vect.begin(), aux_vect.end()); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; #endif userlist->sort(); heaplist->sort(); stdlist->sort(); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; #if !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) aux_vect.assign(50, 0); #endif userlist->insert(userlist->begin(), aux_vect.begin(), aux_vect.end()); heaplist->insert(heaplist->begin(), aux_vect.begin(), aux_vect.end()); stdlist->insert(stdlist->begin(), aux_vect.begin(), aux_vect.end()); userlist->unique(); heaplist->unique(); stdlist->unique(); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->sort(std::greater<int>()); heaplist->sort(std::greater<int>()); stdlist->sort(std::greater<int>()); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->resize(userlist->size()/2); heaplist->resize(heaplist->size()/2); stdlist->resize(stdlist->size()/2); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; userlist->remove(*userlist->begin()); heaplist->remove(*heaplist->begin()); stdlist->remove(*stdlist->begin()); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; for(i = 0; i < max; ++i){ userlist->push_back(i); heaplist->push_back(i); stdlist->push_back(i); } MyUserList otheruserlist(*userlist); MyHeapList otherheaplist(*heaplist); MyStdList otherstdlist(*stdlist); userlist->splice(userlist->begin(), otheruserlist); heaplist->splice(heaplist->begin(), otherheaplist); stdlist->splice(stdlist->begin(), otherstdlist); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; otheruserlist = *userlist; otherheaplist = *heaplist; otherstdlist = *stdlist; userlist->sort(std::greater<int>()); heaplist->sort(std::greater<int>()); stdlist->sort(std::greater<int>()); otheruserlist.sort(std::greater<int>()); otherheaplist.sort(std::greater<int>()); otherstdlist.sort(std::greater<int>()); userlist->merge(otheruserlist, std::greater<int>()); heaplist->merge(otherheaplist, std::greater<int>()); stdlist->merge(otherstdlist, std::greater<int>()); if(!CheckEqual(userlist, stdlist, heaplist)) return 1; user_buffer.destroy<MyUserList>(L"MyUserList"); delete stdlist; //Fill heap buffer until is full try{ while(1){ heaplist->insert(heaplist->end(), 0); } } catch(boost::interprocess::bad_alloc &){} std::size_t heap_list_size = heaplist->size(); //Copy heap buffer to another const char *insert_beg = static_cast<char*>(heap_buffer.get_address()); const char *insert_end = insert_beg + heap_buffer.get_size(); std::vector<char> grow_copy (insert_beg, insert_end); //Destroy old list heap_buffer.destroy<MyHeapList>(L"MyHeapList"); //Resize copy buffer grow_copy.resize(memsize*2); //Open Interprocess machinery in the new managed external buffer wmanaged_external_buffer user_buffer2(open_only, &grow_copy[0], memsize); //Expand old Interprocess machinery to the new size user_buffer2.grow(memsize); //Get a pointer to the full list userlist = user_buffer2.find<MyUserList>(L"MyHeapList").first; if(!userlist){ return 1; } //Fill user buffer until is full try{ while(1){ userlist->insert(userlist->end(), 0); } } catch(boost::interprocess::bad_alloc &){} std::size_t user_list_size = userlist->size(); if(user_list_size <= heap_list_size){ return 1; } user_buffer2.destroy_ptr(userlist); return 0;}#include <boost/interprocess/detail/config_end.hpp>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?