/* Boost.MultiIndex test for memory relocatability. * * Copyright 2003-2026 Joaquin M Lopez Munoz. * 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/multi_index for library home page. */ #include "test_mmap.hpp" #include /* keep it first to prevent nasty warns in MSVC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void test_mmap() { using namespace boost::multi_index; namespace bip=boost::interprocess; using container=multi_index_container< int, indexed_by< ordered_unique>, hashed_unique>, ranked_unique>, sequenced<>, random_access<> >, bip::allocator >; using iterator0=nth_index::type::iterator; using iterator1=nth_index::type::iterator; using local_iterator1=nth_index::type::local_iterator; using iterator2=nth_index::type::iterator; using iterator3=nth_index::type::iterator; using iterator4=nth_index::type::iterator; constexpr auto container_name="container"; static auto file_name_str= std::string("./test_mmap_")+ to_string(boost::uuids::random_generator()()); static auto file_name=file_name_str.c_str(); bip::file_mapping::remove(file_name); std::unique_ptr pseg1( new bip::managed_mapped_file(bip::create_only,file_name,65536)); container& c1=*pseg1->construct(container_name)( container::ctor_args_list(), container::allocator_type(pseg1->get_segment_manager())); for(int i=0;i<100;++i)c1.insert(i); auto v0=**pseg1->construct("it0")(c1.get<0>().begin()); auto v1=**pseg1->construct("it1")(c1.get<1>().begin()); auto lv1=**pseg1->construct("lit1")(c1.get<1>().begin(0)); auto v2=**pseg1->construct("it2")(c1.get<2>().begin()); auto v3=**pseg1->construct("it3")(c1.get<3>().begin()); auto v4=**pseg1->construct("it4")(c1.get<4>().begin()); bip::managed_mapped_file seg2(bip::open_only,file_name); pseg1=nullptr; container& c2=*seg2.find(container_name).first; auto it0=*seg2.find("it0").first; auto it1=*seg2.find("it1").first; auto lit1=*seg2.find("lit1").first; auto it2=*seg2.find("it2").first; auto it3=*seg2.find("it3").first; auto it4=*seg2.find("it4").first; BOOST_TEST_EQ(*it0,v0); BOOST_TEST_EQ(std::distance(it0,c2.get<0>().end()),c2.size()); BOOST_TEST_EQ(*it1,v1); BOOST_TEST_EQ(std::distance(it1,c2.get<1>().end()),c2.size()); BOOST_TEST_EQ(*lit1,lv1); BOOST_TEST_EQ( std::distance(lit1,c2.get<1>().end(0)),c2.get<1>().bucket_size(0)); BOOST_TEST_EQ(*it2,v2); BOOST_TEST_EQ(std::distance(it2,c2.get<2>().end()),c2.size()); BOOST_TEST_EQ(*it3,v3); BOOST_TEST_EQ(std::distance(it3,c2.get<3>().end()),c2.size()); BOOST_TEST_EQ(*it4,v4); BOOST_TEST_EQ(std::distance(it4,c2.get<4>().end()),c2.size()); }