blob: 61d3f0b50548c808ea5d8ad0d7f65bbd70ee989b [file] [log] [blame]
// Boost.Geometry Index
//
// Quickbook Examples
//
// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to 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)
//[rtree_interprocess
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/foreach.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <vector>
#include <string>
#include <cstdlib> //std::system
//For parent process argc == 1, for child process argc > 1
int main(int argc, char *argv[])
{
using namespace boost::interprocess;
namespace bg = boost::geometry;
namespace bgm = bg::model;
namespace bgi = bg::index;
typedef bgm::point<float, 2, bg::cs::cartesian> P;
typedef bgm::box<P> B;
typedef bgi::linear<32, 8> Par;
typedef bgi::indexable<B> I;
typedef bgi::equal_to<B> E;
typedef allocator<B, managed_shared_memory::segment_manager> Alloc;
typedef bgi::rtree<B, Par, I, E, Alloc> Rtree;
//Parent process
if ( argc == 1 )
{
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
std::cout << "Parent: Constructing container\n";
Rtree * tree = segment.construct<Rtree>("Rtree")(Par(), I(), E(), Alloc(segment.get_segment_manager()));
std::cout << "Parent: Filling container with 100 boxes\n";
for ( float i = 0 ; i < 100 ; i += 1 )
tree->insert(B(P(i, i), P(i+0.5f, i+0.5f)));
std::cout << "Parent: Tree content\n";
Rtree::bounds_type bb = tree->bounds();
std::cout << "[(" << bg::get<0>(bb.min_corner()) << ", " << bg::get<1>(bb.min_corner())
<< ")(" << bg::get<0>(bb.max_corner()) << ", " << bg::get<1>(bb.max_corner()) << ")]\n";
std::cout << "Parent: Running child process\n";
std::string s(argv[0]); s += " child ";
if ( 0 != std::system(s.c_str()) )
return 1;
if ( segment.find<Rtree>("Rtree").first )
return 1;
std::cout << "Parent: Container was properly destroyed by the child process\n";
}
//Child process
else
{
managed_shared_memory segment(open_only, "MySharedMemory");
std::cout << "Child: Searching of the container in shared memory\n";
Rtree * tree = segment.find<Rtree>("Rtree").first;
std::cout << "Child: Querying for objects intersecting box = [(45, 45)(55, 55)]\n";
std::vector<B> result;
unsigned k = tree->query(bgi::intersects(B(P(45, 45), P(55, 55))), std::back_inserter(result));
std::cout << "Child: Found objects:\n";
std::cout << k << "\n";
BOOST_FOREACH(B const& b, result)
{
std::cout << "[(" << bg::get<0>(b.min_corner()) << ", " << bg::get<1>(b.min_corner())
<< ")(" << bg::get<0>(b.max_corner()) << ", " << bg::get<1>(b.max_corner()) << ")]\n";
}
std::cout << "\n";
std::cout << "Child: Destroying container\n";
segment.destroy<Rtree>("Rtree");
}
return 0;
};
//]