diff --git a/doc/src/examples/rtree/Jamfile.v2 b/doc/src/examples/rtree/Jamfile.v2 index 9a70926c8..57422ddc1 100644 --- a/doc/src/examples/rtree/Jamfile.v2 +++ b/doc/src/examples/rtree/Jamfile.v2 @@ -6,9 +6,16 @@ # Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -project boost-geometry-index-doc-src-examples-rtree - : # requirements +exe quick_start : quick_start.cpp ; -exe quick_start : quick_start.cpp ; - +exe interprocess : interprocess.cpp /boost/thread//boost_thread + : + acc:-lrt + acc-pa_risc:-lrt + gcc-mingw:"-lole32 -loleaut32 -lpsapi -ladvapi32" + hpux,gcc:"-Wl,+as,mpas" + : + multi + : # requirements + ; diff --git a/doc/src/examples/rtree/interprocess.cpp b/doc/src/examples/rtree/interprocess.cpp new file mode 100644 index 000000000..be8b4a6d0 --- /dev/null +++ b/doc/src/examples/rtree/interprocess.cpp @@ -0,0 +1,105 @@ +// Boost.Geometry.Index Rtree interprocess example + +// Copyright (c) 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) + +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include //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 P; + typedef bgm::box

B; + + typedef bgi::linear<32, 8> Par; + typedef bgi::translator::def Tr; + typedef allocator Alloc; + typedef bgi::rtree 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")(Par(), Tr(), 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").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").first; + + std::cout << "Child: Querying for objects intersecting box = [(45, 45)(55, 55)]\n"; + + std::vector result; + unsigned k = tree->query(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"); + } + + return 0; +}; diff --git a/tests/additional_glut_vis.cpp b/tests/additional_glut_vis.cpp index 9f0bf2417..3ac3bb71a 100644 --- a/tests/additional_glut_vis.cpp +++ b/tests/additional_glut_vis.cpp @@ -7,7 +7,7 @@ // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -#include +#include #define BOOST_GEOMETRY_INDEX_ENABLE_DEBUG_INTERFACE