11#pragma  once
22
3+ #include  < iterator> 
4+ #include  < vector> 
5+ 
36#include  " pico_tree/core.hpp" 
47#include  " pico_tree/internal/memory.hpp" 
58#include  " pico_tree/internal/stream_wrapper.hpp" 
@@ -9,13 +12,33 @@ namespace pico_tree::internal {
912// ! \brief The data structure that represents a kd_tree.
1013template  <typename  Node_, size_t  Dim_>
1114class  kd_tree_data  {
15+   template  <typename  Iterator_>
16+   class  iterator_range  {
17+    public: 
18+     using  iterator_type = Iterator_;
19+     using  difference_type =
20+         typename  std::iterator_traits<Iterator_>::difference_type;
21+ 
22+     constexpr  iterator_range (Iterator_ begin, Iterator_ end)
23+         : begin_(begin), end_(end) {}
24+ 
25+     constexpr  Iterator_ begin () const  { return  begin_; }
26+     constexpr  Iterator_ end () const  { return  end_; }
27+ 
28+    private: 
29+     Iterator_ begin_;
30+     Iterator_ end_;
31+   };
32+ 
1233 public: 
1334  using  index_type = typename  Node_::index_type;
1435  using  scalar_type = typename  Node_::scalar_type;
1536  static  size_t  constexpr  dim = Dim_;
1637  using  box_type = internal::box<scalar_type, dim>;
1738  using  node_type = Node_;
1839  using  node_allocator_type = chunk_allocator<node_type, 256 >;
40+   using  leaf_range_type =
41+       iterator_range<typename  std::vector<index_type>::const_iterator>;
1942
2043  static  kd_tree_data load (stream_wrapper& stream) {
2144    typename  box_type::size_type sdim;
@@ -34,6 +57,12 @@ class kd_tree_data {
3457    data.write (stream);
3558  }
3659
60+   inline  std::vector<leaf_range_type> leaf_ranges () const  {
61+     std::vector<leaf_range_type> ranges;
62+     insert_leaf_range (root_node, ranges);
63+     return  ranges;
64+   }
65+ 
3766  // ! \brief Sorted indices that refer to points inside points_.
3867  std::vector<index_type> indices;
3968  // ! \brief Bounding box of the root node.
@@ -44,6 +73,19 @@ class kd_tree_data {
4473  node_type* root_node;
4574
4675 private: 
76+   inline  void  insert_leaf_range (
77+       node_type const * const  node, std::vector<leaf_range_type>& ranges) const  {
78+     if  (node->is_leaf () && !node->data .leaf .empty ()) {
79+       using  difference_type = typename  leaf_range_type::difference_type;
80+       ranges.push_back (leaf_range_type (
81+           indices.begin () + difference_type (node->data .leaf .begin_idx ),
82+           indices.begin () + difference_type (node->data .leaf .end_idx )));
83+     } else  {
84+       insert_leaf_range (node->left , ranges);
85+       insert_leaf_range (node->right , ranges);
86+     }
87+   }
88+ 
4789  // ! \brief Recursively reads the Node and its descendants.
4890  inline  node_type* read_node (stream_wrapper& stream) {
4991    node_type* node = allocator.allocate ();
0 commit comments