]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/geometry/index/detail/rtree/rstar/insert.hpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / boost / geometry / index / detail / rtree / rstar / insert.hpp
index 73a5ccefce4f87f5fd3a50bf2fdc32466b1528cf..e11636f0f73d467d88bd28836a94f291a44e3766 100644 (file)
@@ -56,15 +56,18 @@ struct comparable_distance_point_point<Point1, Point2, default_strategy>
     }
 };
 
-template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template <typename MembersHolder>
 class remove_elements_to_reinsert
 {
 public:
-    typedef typename rtree::node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type node;
-    typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
-    typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
+    typedef typename MembersHolder::box_type box_type;
+    typedef typename MembersHolder::parameters_type parameters_type;
+    typedef typename MembersHolder::translator_type translator_type;
+    typedef typename MembersHolder::allocators_type allocators_type;
 
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename MembersHolder::node node;
+    typedef typename MembersHolder::internal_node internal_node;
+    typedef typename MembersHolder::leaf leaf;
 
     //typedef typename Allocators::internal_node_pointer internal_node_pointer;
     typedef internal_node * internal_node_pointer;
@@ -75,12 +78,12 @@ public:
                              internal_node_pointer parent,
                              size_t current_child_index,
                              parameters_type const& parameters,
-                             Translator const& translator,
-                             Allocators & allocators)
+                             translator_type const& translator,
+                             allocators_type & allocators)
     {
         typedef typename rtree::elements_type<Node>::type elements_type;
         typedef typename elements_type::value_type element_type;
-        typedef typename geometry::point_type<Box>::type point_type;
+        typedef typename geometry::point_type<box_type>::type point_type;
         typedef typename index::detail::strategy_type<parameters_type>::type strategy_type;
         // TODO: awulkiew - change second point_type to the point type of the Indexable?
         typedef rstar::comparable_distance_point_point
@@ -159,7 +162,7 @@ public:
             for ( typename sorted_elements_type::iterator it = sorted_elements.begin() ;
                   it != sorted_elements.end() ; ++it )
             {
-                destroy_element<Value, Options, Translator, Box, Allocators>::apply(it->second, allocators);
+                destroy_element<MembersHolder>::apply(it->second, allocators);
             }
 
             BOOST_RETHROW                                                                                 // RETHROW
@@ -187,48 +190,69 @@ private:
     }
 };
 
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Box, typename Allocators>
+template
+<
+    size_t InsertIndex,
+    typename Element,
+    typename MembersHolder,
+    bool IsValue = boost::is_same<Element, typename MembersHolder::value_type>::value
+>
 struct level_insert_elements_type
 {
     typedef typename rtree::elements_type<
-        typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type
+        typename rtree::internal_node<
+            typename MembersHolder::value_type,
+            typename MembersHolder::parameters_type,
+            typename MembersHolder::box_type,
+            typename MembersHolder::allocators_type,
+            typename MembersHolder::node_tag
+        >::type
     >::type type;
 };
 
-template <typename Value, typename Options, typename Box, typename Allocators>
-struct level_insert_elements_type<0, Value, Value, Options, Box, Allocators>
+template <typename Value, typename MembersHolder>
+struct level_insert_elements_type<0, Value, MembersHolder, true>
 {
     typedef typename rtree::elements_type<
-        typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type
+        typename rtree::leaf<
+            typename MembersHolder::value_type,
+            typename MembersHolder::parameters_type,
+            typename MembersHolder::box_type,
+            typename MembersHolder::allocators_type,
+            typename MembersHolder::node_tag
+        >::type
     >::type type;
 };
 
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template <size_t InsertIndex, typename Element, typename MembersHolder>
 struct level_insert_base
-    : public detail::insert<Element, Value, Options, Translator, Box, Allocators>
+    : public detail::insert<Element, MembersHolder>
 {
-    typedef detail::insert<Element, Value, Options, Translator, Box, Allocators> base;
+    typedef detail::insert<Element, MembersHolder> base;
     typedef typename base::node node;
     typedef typename base::internal_node internal_node;
     typedef typename base::leaf leaf;
 
-    typedef typename level_insert_elements_type<InsertIndex, Element, Value, Options, Box, Allocators>::type elements_type;
+    typedef typename level_insert_elements_type<InsertIndex, Element, MembersHolder>::type elements_type;
     typedef typename index::detail::rtree::container_from_elements_type<
         elements_type,
         typename elements_type::value_type
     >::type result_elements_type;
 
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename MembersHolder::box_type box_type;
+    typedef typename MembersHolder::parameters_type parameters_type;
+    typedef typename MembersHolder::translator_type translator_type;
+    typedef typename MembersHolder::allocators_type allocators_type;
 
-    typedef typename Allocators::node_pointer node_pointer;
-    typedef typename Allocators::size_type size_type;
+    typedef typename allocators_type::node_pointer node_pointer;
+    typedef typename allocators_type::size_type size_type;
 
     inline level_insert_base(node_pointer & root,
                              size_type & leafs_level,
                              Element const& element,
                              parameters_type const& parameters,
-                             Translator const& translator,
-                             Allocators & allocators,
+                             translator_type const& translator,
+                             allocators_type & allocators,
                              size_type relative_level)
         : base(root, leafs_level, element, parameters, translator, allocators, relative_level)
         , result_relative_level(0)
@@ -249,7 +273,7 @@ struct level_insert_base
             {
                 // NOTE: exception-safety
                 // After an exception result_elements may contain garbage, don't use it
-                rstar::remove_elements_to_reinsert<Value, Options, Translator, Box, Allocators>::apply(
+                rstar::remove_elements_to_reinsert<MembersHolder>::apply(
                     result_elements, n,
                     base::m_traverse_data.parent, base::m_traverse_data.current_child_index,
                     base::m_parameters, base::m_translator, base::m_allocators);                            // MAY THROW, BASIC (V, E: alloc, copy)
@@ -287,43 +311,51 @@ struct level_insert_base
     inline void recalculate_aabb(Node const& n) const
     {
         base::m_traverse_data.current_element().first =
-            elements_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(),
-                              base::m_translator,
-                              index::detail::get_strategy(base::m_parameters));
+            elements_box<box_type>(rtree::elements(n).begin(), rtree::elements(n).end(),
+                                   base::m_translator,
+                                   index::detail::get_strategy(base::m_parameters));
     }
 
     inline void recalculate_aabb(leaf const& n) const
     {
         base::m_traverse_data.current_element().first =
-            values_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(),
-                            base::m_translator,
-                            index::detail::get_strategy(base::m_parameters));
+            values_box<box_type>(rtree::elements(n).begin(), rtree::elements(n).end(),
+                                 base::m_translator,
+                                 index::detail::get_strategy(base::m_parameters));
     }
 
     size_type result_relative_level;
     result_elements_type result_elements;
 };
 
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template
+<
+    size_t InsertIndex,
+    typename Element,
+    typename MembersHolder,
+    bool IsValue = boost::is_same<Element, typename MembersHolder::value_type>::value
+>
 struct level_insert
-    : public level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators>
+    : public level_insert_base<InsertIndex, Element, MembersHolder>
 {
-    typedef level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators> base;
+    typedef level_insert_base<InsertIndex, Element, MembersHolder> base;
     typedef typename base::node node;
     typedef typename base::internal_node internal_node;
     typedef typename base::leaf leaf;
 
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename base::parameters_type parameters_type;
+    typedef typename base::translator_type translator_type;
+    typedef typename base::allocators_type allocators_type;
 
-    typedef typename Allocators::node_pointer node_pointer;
-    typedef typename Allocators::size_type size_type;
+    typedef typename base::node_pointer node_pointer;
+    typedef typename base::size_type size_type;
 
     inline level_insert(node_pointer & root,
                         size_type & leafs_level,
                         Element const& element,
                         parameters_type const& parameters,
-                        Translator const& translator,
-                        Allocators & allocators,
+                        translator_type const& translator,
+                        allocators_type & allocators,
                         size_type relative_level)
         : base(root, leafs_level, element, parameters, translator, allocators, relative_level)
     {}
@@ -362,8 +394,7 @@ struct level_insert
                 // NOTE: exception-safety
                 // if the insert fails above, the element won't be stored in the tree, so delete it
 
-                rtree::visitors::destroy<Value, Options, Translator, Box, Allocators> del_v(base::m_element.second, base::m_allocators);
-                rtree::apply_visitor(del_v, *base::m_element.second);
+                rtree::visitors::destroy<MembersHolder>::apply(base::m_element.second, base::m_allocators);
 
                 BOOST_RETHROW                                                                                 // RETHROW
             }
@@ -390,26 +421,29 @@ struct level_insert
     }
 };
 
-template <size_t InsertIndex, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-struct level_insert<InsertIndex, Value, Value, Options, Translator, Box, Allocators>
-    : public level_insert_base<InsertIndex, Value, Value, Options, Translator, Box, Allocators>
+template <size_t InsertIndex, typename Value, typename MembersHolder>
+struct level_insert<InsertIndex, Value, MembersHolder, true>
+    : public level_insert_base<InsertIndex, typename MembersHolder::value_type, MembersHolder>
 {
-    typedef level_insert_base<InsertIndex, Value, Value, Options, Translator, Box, Allocators> base;
+    typedef level_insert_base<InsertIndex, typename MembersHolder::value_type, MembersHolder> base;
     typedef typename base::node node;
     typedef typename base::internal_node internal_node;
     typedef typename base::leaf leaf;
 
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename MembersHolder::value_type value_type;
+    typedef typename base::parameters_type parameters_type;
+    typedef typename base::translator_type translator_type;
+    typedef typename base::allocators_type allocators_type;
 
-    typedef typename Allocators::node_pointer node_pointer;
-    typedef typename Allocators::size_type size_type;
+    typedef typename base::node_pointer node_pointer;
+    typedef typename base::size_type size_type;
 
     inline level_insert(node_pointer & root,
                         size_type & leafs_level,
-                        Value const& v,
+                        value_type const& v,
                         parameters_type const& parameters,
-                        Translator const& translator,
-                        Allocators & allocators,
+                        translator_type const& translator,
+                        allocators_type & allocators,
                         size_type relative_level)
         : base(root, leafs_level, v, parameters, translator, allocators, relative_level)
     {}
@@ -446,26 +480,29 @@ struct level_insert<InsertIndex, Value, Value, Options, Translator, Box, Allocat
     }
 };
 
-template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-struct level_insert<0, Value, Value, Options, Translator, Box, Allocators>
-    : public level_insert_base<0, Value, Value, Options, Translator, Box, Allocators>
+template <typename Value, typename MembersHolder>
+struct level_insert<0, Value, MembersHolder, true>
+    : public level_insert_base<0, typename MembersHolder::value_type, MembersHolder>
 {
-    typedef level_insert_base<0, Value, Value, Options, Translator, Box, Allocators> base;
+    typedef level_insert_base<0, typename MembersHolder::value_type, MembersHolder> base;
     typedef typename base::node node;
     typedef typename base::internal_node internal_node;
     typedef typename base::leaf leaf;
 
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename MembersHolder::value_type value_type;
+    typedef typename base::parameters_type parameters_type;
+    typedef typename base::translator_type translator_type;
+    typedef typename base::allocators_type allocators_type;
 
-    typedef typename Allocators::node_pointer node_pointer;
-    typedef typename Allocators::size_type size_type;
+    typedef typename base::node_pointer node_pointer;
+    typedef typename base::size_type size_type;
 
     inline level_insert(node_pointer & root,
                         size_type & leafs_level,
-                        Value const& v,
+                        value_type const& v,
                         parameters_type const& parameters,
-                        Translator const& translator,
-                        Allocators & allocators,
+                        translator_type const& translator,
+                        allocators_type & allocators,
                         size_type relative_level)
         : base(root, leafs_level, v, parameters, translator, allocators, relative_level)
     {}
@@ -505,26 +542,28 @@ struct level_insert<0, Value, Value, Options, Translator, Box, Allocators>
 // After passing the Element to insert visitor the Element is managed by the tree
 // I.e. one should not delete the node passed to the insert visitor after exception is thrown
 // because this visitor may delete it
-template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-class insert<Element, Value, Options, Translator, Box, Allocators, insert_reinsert_tag>
-    : public rtree::visitor<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag, false>::type
+template <typename Element, typename MembersHolder>
+class insert<Element, MembersHolder, insert_reinsert_tag>
+    : public MembersHolder::visitor
 {
-    typedef typename Options::parameters_type parameters_type;
+    typedef typename MembersHolder::parameters_type parameters_type;
+    typedef typename MembersHolder::translator_type translator_type;
+    typedef typename MembersHolder::allocators_type allocators_type;
 
-    typedef typename rtree::node<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type node;
-    typedef typename rtree::internal_node<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
-    typedef typename rtree::leaf<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
+    typedef typename MembersHolder::node node;
+    typedef typename MembersHolder::internal_node internal_node;
+    typedef typename MembersHolder::leaf leaf;
 
-    typedef typename Allocators::node_pointer node_pointer;
-    typedef typename Allocators::size_type size_type;
+    typedef typename allocators_type::node_pointer node_pointer;
+    typedef typename allocators_type::size_type size_type;
 
 public:
     inline insert(node_pointer & root,
                   size_type & leafs_level,
                   Element const& element,
                   parameters_type const& parameters,
-                  Translator const& translator,
-                  Allocators & allocators,
+                  translator_type const& translator,
+                  allocators_type & allocators,
                   size_type relative_level = 0)
         : m_root(root), m_leafs_level(leafs_level), m_element(element)
         , m_parameters(parameters), m_translator(translator)
@@ -539,7 +578,7 @@ public:
         // Distinguish between situation when reinserts are required and use adequate visitor, otherwise use default one
         if ( m_parameters.get_reinserted_elements() > 0 )
         {
-            rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+            rstar::level_insert<0, Element, MembersHolder> lins_v(
                 m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
 
             rtree::apply_visitor(lins_v, *m_root);                                                              // MAY THROW (V, E: alloc, copy, N: alloc)
@@ -551,7 +590,7 @@ public:
         }
         else
         {
-            visitors::insert<Element, Value, Options, Translator, Box, Allocators, insert_default_tag> ins_v(
+            visitors::insert<Element, MembersHolder, insert_default_tag> ins_v(
                 m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
 
             rtree::apply_visitor(ins_v, *m_root); 
@@ -566,7 +605,7 @@ public:
         // Distinguish between situation when reinserts are required and use adequate visitor, otherwise use default one
         if ( m_parameters.get_reinserted_elements() > 0 )
         {
-            rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+            rstar::level_insert<0, Element, MembersHolder> lins_v(
                 m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
 
             rtree::apply_visitor(lins_v, *m_root);                                                              // MAY THROW (V, E: alloc, copy, N: alloc)
@@ -576,7 +615,7 @@ public:
         }
         else
         {
-            visitors::insert<Element, Value, Options, Translator, Box, Allocators, insert_default_tag> ins_v(
+            visitors::insert<Element, MembersHolder, insert_default_tag> ins_v(
                 m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
 
             rtree::apply_visitor(ins_v, *m_root); 
@@ -593,7 +632,7 @@ private:
         typename Elements::reverse_iterator it = elements.rbegin();
         for ( ; it != elements.rend() ; ++it)
         {
-            rstar::level_insert<1, element_type, Value, Options, Translator, Box, Allocators> lins_v(
+            rstar::level_insert<1, element_type, MembersHolder> lins_v(
                 m_root, m_leafs_level, *it, m_parameters, m_translator, m_allocators, relative_level);
 
             BOOST_TRY
@@ -604,7 +643,7 @@ private:
             {
                 ++it;
                 for ( ; it != elements.rend() ; ++it)
-                    rtree::destroy_element<Value, Options, Translator, Box, Allocators>::apply(*it, m_allocators);
+                    rtree::destroy_element<MembersHolder>::apply(*it, m_allocators);
                 BOOST_RETHROW                                                                                     // RETHROW
             }
             BOOST_CATCH_END
@@ -624,11 +663,11 @@ private:
     Element const& m_element;
 
     parameters_type const& m_parameters;
-    Translator const& m_translator;
+    translator_type const& m_translator;
 
     size_type m_relative_level;
 
-    Allocators & m_allocators;
+    allocators_type & m_allocators;
 };
 
 }}} // namespace detail::rtree::visitors