destroy.hpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Boost.Geometry Index
  2. //
  3. // R-tree destroying visitor implementation
  4. //
  5. // Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
  6. //
  7. // This file was modified by Oracle on 2019.
  8. // Modifications copyright (c) 2019 Oracle and/or its affiliates.
  9. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  10. //
  11. // Use, modification and distribution is subject to the Boost Software License,
  12. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  13. // http://www.boost.org/LICENSE_1_0.txt)
  14. #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_DELETE_HPP
  15. #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_DELETE_HPP
  16. namespace boost { namespace geometry { namespace index {
  17. namespace detail { namespace rtree { namespace visitors {
  18. template <typename MembersHolder>
  19. class destroy
  20. : public MembersHolder::visitor
  21. {
  22. public:
  23. typedef typename MembersHolder::node node;
  24. typedef typename MembersHolder::internal_node internal_node;
  25. typedef typename MembersHolder::leaf leaf;
  26. typedef typename MembersHolder::allocators_type allocators_type;
  27. typedef typename MembersHolder::node_pointer node_pointer;
  28. inline destroy(node_pointer node, allocators_type & allocators)
  29. : m_current_node(node)
  30. , m_allocators(allocators)
  31. {}
  32. inline void operator()(internal_node & n)
  33. {
  34. BOOST_GEOMETRY_INDEX_ASSERT(&n == &rtree::get<internal_node>(*m_current_node), "invalid pointers");
  35. node_pointer node_to_destroy = m_current_node;
  36. typedef typename rtree::elements_type<internal_node>::type elements_type;
  37. elements_type & elements = rtree::elements(n);
  38. for (typename elements_type::iterator it = elements.begin();
  39. it != elements.end(); ++it)
  40. {
  41. m_current_node = it->second;
  42. rtree::apply_visitor(*this, *m_current_node);
  43. it->second = 0;
  44. }
  45. rtree::destroy_node<allocators_type, internal_node>::apply(m_allocators, node_to_destroy);
  46. }
  47. inline void operator()(leaf & l)
  48. {
  49. boost::ignore_unused(l);
  50. BOOST_GEOMETRY_INDEX_ASSERT(&l == &rtree::get<leaf>(*m_current_node), "invalid pointers");
  51. rtree::destroy_node<allocators_type, leaf>::apply(m_allocators, m_current_node);
  52. }
  53. static inline void apply(node_pointer node, allocators_type & allocators)
  54. {
  55. destroy v(node, allocators);
  56. rtree::apply_visitor(v, *node);
  57. }
  58. private:
  59. node_pointer m_current_node;
  60. allocators_type & m_allocators;
  61. };
  62. }}} // namespace detail::rtree::visitors
  63. }}} // namespace boost::geometry::index
  64. #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_DELETE_HPP