16 #ifndef dealii_numerics_rtree_h
17 #define dealii_numerics_rtree_h
29 #include <boost/geometry/index/rtree.hpp>
30 #include <boost/geometry/strategies/strategies.hpp>
140 template <
typename LeafType,
141 typename IndexType = boost::geometry::index::linear<16>,
142 typename IndexableGetter =
145 boost::geometry::index::rtree<LeafType, IndexType, IndexableGetter>;
154 template <
typename IndexType = boost::geometry::index::linear<16>,
155 typename LeafTypeIterator,
156 typename IndexableGetter = boost::geometry::index::indexable<
157 typename LeafTypeIterator::value_type>>
171 template <
typename IndexType = boost::geometry::index::linear<16>,
172 typename ContainerType,
173 typename IndexableGetter = boost::geometry::index::indexable<
174 typename ContainerType::value_type>>
196 template <
typename Container>
276 template <
typename IndexType = boost::geometry::index::linear<16>,
277 typename ContainerType>
295 template <
typename Value,
301 :
public boost::geometry::index::detail::rtree::visitor<
303 typename Options::parameters_type,
306 typename Options::node_tag,
322 typename boost::geometry::index::detail::rtree::internal_node<
324 typename Options::parameters_type,
327 typename Options::node_tag>::type;
332 using Leaf =
typename boost::geometry::index::detail::rtree::leaf<
334 typename Options::parameters_type,
337 typename Options::node_tag>::type;
370 std::vector<BoundingBox<boost::geometry::dimension<Box>::value>> &
boxes;
424 template <
typename Rtree>
426 boost::geometry::dimension<typename Rtree::indexable_type>::value>>
434 template <
typename IndexType,
435 typename LeafTypeIterator,
436 typename IndexableGetter>
440 return RTree<
typename LeafTypeIterator::value_type,
447 template <
typename IndexType,
typename ContainerType,
typename IndexableGetter>
451 return pack_rtree<IndexType, decltype(container.begin()), IndexableGetter>(
452 container.begin(), container.end());
457 template <
typename IndexType,
typename ContainerType>
465 indices(0, container.size());
477 template <
typename Value,
484 const Translator & translator,
485 const unsigned int target_level,
486 std::vector<
BoundingBox<boost::geometry::dimension<Box>::value>> &boxes)
487 : translator(translator)
489 , target_level(target_level)
495 template <
typename Value,
505 typename boost::geometry::index::detail::rtree::elements_type<
508 const auto &elements = boost::geometry::index::detail::rtree::elements(node);
510 if (
level == target_level)
512 const auto offset = boxes.size();
513 boxes.resize(offset + elements.size());
515 unsigned int i = offset;
516 for (
typename ElmentsType::const_iterator it = elements.begin();
517 it != elements.end();
520 boost::geometry::convert(it->first, boxes[i]);
526 const size_t level_backup =
level;
529 for (
typename ElmentsType::const_iterator it = elements.begin();
530 it != elements.end();
533 boost::geometry::index::detail::rtree::apply_visitor(*
this, *it->second);
536 level = level_backup;
539 template <
typename Value,
551 template <
typename Rtree>
553 boost::geometry::dimension<typename Rtree::indexable_type>::value>>
556 constexpr
unsigned int dim =
557 boost::geometry::dimension<typename Rtree::indexable_type>::value;
560 boost::geometry::index::detail::rtree::utilities::view<Rtree>;
563 std::vector<BoundingBox<dim>> boxes;
565 if (rtv.depth() == 0)
571 boost::geometry::convert(tree.bounds(), boxes[0]);
575 const unsigned int target_level =
576 std::min<unsigned int>(
level, rtv.depth() - 1);
579 typename RtreeView::options_type,
580 typename RtreeView::translator_type,
581 typename RtreeView::box_type,
582 typename RtreeView::allocators_type>
583 extract_level_visitor(rtv.translator(), target_level, boxes);
584 rtv.apply_visitor(extract_level_visitor);
592 template <
class Rtree>
594 n_levels(
const Rtree &tree)
596 boost::geometry::index::detail::rtree::utilities::view<Rtree> rtv(tree);
result_type operator()(size_t i) const
const Container & container
typename boost::geometry::index::indexable< typename Container::value_type > IndexableGetter
typename IndexableGetter::result_type result_type
IndexableGetterFromIndices(Container const &c)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
types::global_dof_index size_type
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
boost::integer_range< IncrementableType > iota_view
std::vector< BoundingBox< boost::geometry::dimension< typename Rtree::indexable_type >::value > > extract_rtree_level(const Rtree &tree, const unsigned int level)
RTree< typename ContainerType::size_type, IndexType, IndexableGetterFromIndices< ContainerType > > pack_rtree_of_indices(const ContainerType &container)
boost::geometry::index::rtree< LeafType, IndexType, IndexableGetter > RTree
RTree< typename LeafTypeIterator::value_type, IndexType, IndexableGetter > pack_rtree(const LeafTypeIterator &begin, const LeafTypeIterator &end)