30 template <forest_order order, 
typename T>
 
   33     std::conditional_t<order == forest_order::depth_first, std::stack<T>, std::queue<T>>;
 
   34   void add(T 
const& val) { data_.push(val); }
 
   35   void add(T 
const& hot, T 
const& distant)
 
   48       auto result = data_.top();
 
   52       auto result = data_.front();
 
   65   [[nodiscard]] 
auto empty() { 
return data_.empty(); }
 
   66   auto size() { 
return data_.size(); }
 
   74 template <
typename node_t = traversal_node<std::
size_t>, 
typename tree_
id_t = std::
size_t>
 
   84   traversal_forest(std::vector<node_uid_type>&& root_node_uids) : root_node_uids_{root_node_uids} {}
 
   86   template <forest_order order, 
typename lambda_t>
 
   99                          std::pair<node_uid_type, index_type>>>{};
 
  103       for (
auto const& root_node_uid : root_node_uids_) {
 
  104         to_be_visited.
add(std::make_pair(root_node_uid, std::size_t{}));
 
  105         parent_indices.add(cur_index);
 
  106         while (!to_be_visited.empty()) {
 
  107           auto [node_uid, depth] = to_be_visited.next();
 
  108           auto parent_index      = parent_indices.next();
 
  110           lambda(node_uid.first, node, depth, parent_index);
 
  111           if (!node.is_leaf()) {
 
  112             auto hot_uid     = std::make_pair(std::make_pair(node_uid.first, node.hot_child()),
 
  114             auto distant_uid = std::make_pair(std::make_pair(node_uid.first, node.distant_child()),
 
  116             to_be_visited.add(hot_uid, distant_uid);
 
  117             parent_indices.add(cur_index, cur_index);
 
  123       for (
auto const& root_node_uid : root_node_uids_) {
 
  124         to_be_visited.add(root_node_uid);
 
  125         parent_indices.add(cur_index++);
 
  129       while (!to_be_visited.empty()) {
 
  130         auto layer_node_uids      = std::vector<node_uid_type>{};
 
  131         auto layer_parent_indices = std::vector<index_type>{};
 
  132         while (!to_be_visited.empty()) {
 
  133           layer_node_uids.push_back(to_be_visited.next());
 
  134           layer_parent_indices.push_back(parent_indices.next());
 
  136         for (
auto layer_index = 
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
 
  137           auto node_uid     = layer_node_uids[layer_index];
 
  138           auto parent_index = layer_parent_indices[layer_index];
 
  140           lambda(node_uid.first, node, depth, parent_index);
 
  141           if (!node.is_leaf()) {
 
  142             auto hot_uid = std::make_pair(node_uid.first, node.hot_child());
 
  143             to_be_visited.add(hot_uid);
 
  144             parent_indices.add(cur_index);
 
  149         cur_index -= layer_node_uids.size();
 
  150         for (
auto layer_index = 
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
 
  151           auto node_uid = layer_node_uids[layer_index];
 
  153           if (!node.is_leaf()) {
 
  154             auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
 
  155             to_be_visited.add(distant_uid);
 
  156             parent_indices.add(cur_index);
 
  163       for (
auto const& root_node_uid : root_node_uids_) {
 
  164         to_be_visited.add(root_node_uid);
 
  165         parent_indices.add(cur_index++);
 
  169       while (!to_be_visited.empty()) {
 
  170         auto layer_node_uids      = std::vector<node_uid_type>{};
 
  171         auto layer_parent_indices = std::vector<index_type>{};
 
  172         while (!to_be_visited.empty()) {
 
  173           layer_node_uids.push_back(to_be_visited.next());
 
  174           layer_parent_indices.push_back(parent_indices.next());
 
  176         for (
auto layer_index = 
index_type{}; layer_index < layer_node_uids.size(); ++layer_index) {
 
  177           auto node_uid     = layer_node_uids[layer_index];
 
  178           auto parent_index = layer_parent_indices[layer_index];
 
  180           lambda(node_uid.first, node, depth, parent_index);
 
  181           if (!node.is_leaf()) {
 
  182             auto hot_uid     = std::make_pair(node_uid.first, node.hot_child());
 
  183             auto distant_uid = std::make_pair(node_uid.first, node.distant_child());
 
  184             to_be_visited.add(hot_uid, distant_uid);
 
  185             parent_indices.add(cur_index, cur_index);
 
  197   std::vector<node_uid_type> root_node_uids_{};
 
@ layered_children_segregated
 
@ layered_children_together
 
Definition: dbscan.hpp:29
 
Definition: traversal_forest.hpp:31
 
auto peek()
Definition: traversal_forest.hpp:57
 
auto size()
Definition: traversal_forest.hpp:66
 
void add(T const &hot, T const &distant)
Definition: traversal_forest.hpp:35
 
void add(T const &val)
Definition: traversal_forest.hpp:34
 
auto empty()
Definition: traversal_forest.hpp:65
 
std::conditional_t< order==forest_order::depth_first, std::stack< T >, std::queue< T > > backing_container_t
Definition: traversal_forest.hpp:33
 
auto next()
Definition: traversal_forest.hpp:45
 
Definition: traversal_forest.hpp:75
 
tree_id_t tree_id_type
Definition: traversal_forest.hpp:78
 
typename node_type::id_type node_id_type
Definition: traversal_forest.hpp:77
 
std::pair< tree_id_type, node_id_type > node_uid_type
Definition: traversal_forest.hpp:79
 
std::size_t index_type
Definition: traversal_forest.hpp:80
 
traversal_forest(std::vector< node_uid_type > &&root_node_uids)
Definition: traversal_forest.hpp:84
 
void for_each(lambda_t &&lambda) const
Definition: traversal_forest.hpp:87
 
node_t node_type
Definition: traversal_forest.hpp:76
 
virtual node_type get_node(tree_id_type tree_id, node_id_type node_id) const =0