]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/doc/index/src/examples/rtree/interprocess.cpp
1 // Boost.Geometry Index
5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
13 #include <boost/geometry.hpp>
14 #include <boost/geometry/geometries/point.hpp>
15 #include <boost/geometry/geometries/box.hpp>
17 #include <boost/geometry/index/rtree.hpp>
19 #include <boost/foreach.hpp>
21 #include <boost/interprocess/managed_shared_memory.hpp>
22 #include <boost/interprocess/allocators/allocator.hpp>
26 #include <cstdlib> //std::system
28 //For parent process argc == 1, for child process argc > 1
29 int main(int argc
, char *argv
[])
31 using namespace boost::interprocess
;
32 namespace bg
= boost::geometry
;
33 namespace bgm
= bg::model
;
34 namespace bgi
= bg::index
;
36 typedef bgm::point
<float, 2, bg::cs::cartesian
> P
;
37 typedef bgm::box
<P
> B
;
39 typedef bgi::linear
<32, 8> Par
;
40 typedef bgi::indexable
<B
> I
;
41 typedef bgi::equal_to
<B
> E
;
42 typedef allocator
<B
, managed_shared_memory::segment_manager
> Alloc
;
43 typedef bgi::rtree
<B
, Par
, I
, E
, Alloc
> Rtree
;
50 shm_remove() { shared_memory_object::remove("MySharedMemory"); }
51 ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
54 managed_shared_memory
segment(create_only
, "MySharedMemory", 65536);
56 std::cout
<< "Parent: Constructing container\n";
58 Rtree
* tree
= segment
.construct
<Rtree
>("Rtree")(Par(), I(), E(), Alloc(segment
.get_segment_manager()));
60 std::cout
<< "Parent: Filling container with 100 boxes\n";
62 for ( float i
= 0 ; i
< 100 ; i
+= 1 )
63 tree
->insert(B(P(i
, i
), P(i
+0.5f
, i
+0.5f
)));
65 std::cout
<< "Parent: Tree content\n";
66 Rtree::bounds_type bb
= tree
->bounds();
67 std::cout
<< "[(" << bg::get
<0>(bb
.min_corner()) << ", " << bg::get
<1>(bb
.min_corner())
68 << ")(" << bg::get
<0>(bb
.max_corner()) << ", " << bg::get
<1>(bb
.max_corner()) << ")]\n";
70 std::cout
<< "Parent: Running child process\n";
72 std::string
s(argv
[0]); s
+= " child ";
73 if ( 0 != std::system(s
.c_str()) )
76 if ( segment
.find
<Rtree
>("Rtree").first
)
79 std::cout
<< "Parent: Container was properly destroyed by the child process\n";
84 managed_shared_memory
segment(open_only
, "MySharedMemory");
86 std::cout
<< "Child: Searching of the container in shared memory\n";
88 Rtree
* tree
= segment
.find
<Rtree
>("Rtree").first
;
90 std::cout
<< "Child: Querying for objects intersecting box = [(45, 45)(55, 55)]\n";
92 std::vector
<B
> result
;
93 unsigned k
= tree
->query(bgi::intersects(B(P(45, 45), P(55, 55))), std::back_inserter(result
));
95 std::cout
<< "Child: Found objects:\n";
96 std::cout
<< k
<< "\n";
97 BOOST_FOREACH(B
const& b
, result
)
99 std::cout
<< "[(" << bg::get
<0>(b
.min_corner()) << ", " << bg::get
<1>(b
.min_corner())
100 << ")(" << bg::get
<0>(b
.max_corner()) << ", " << bg::get
<1>(b
.max_corner()) << ")]\n";
104 std::cout
<< "Child: Destroying container\n";
106 segment
.destroy
<Rtree
>("Rtree");