Wayverb
multitree.h
1 #pragma once
2 
3 #include "core/recursive_vector.h"
4 
5 #include <set>
6 
7 namespace wayverb {
8 namespace raytracer {
9 
12 template <typename T>
13 struct multitree final {
14  explicit multitree(T item = T{})
15  : item(std::move(item)) {}
16 
17  T item;
19  branches_type branches;
20 };
21 
22 template <typename T>
23 constexpr bool operator<(const multitree<T>& a, const multitree<T>& b) {
24  return a.item < b.item;
25 }
26 
27 template <typename T, typename It>
28 void add_path(multitree<T>& tree, It begin, It end) {
29  if (begin != end) {
30  const auto it = tree.branches.insert(multitree<T>{*begin}).first;
31  add_path(*it, std::next(begin), end);
32  }
33 }
34 
35 namespace detail {
36 
38 template <typename T, typename Callback>
39 void traverse_multitree(const multitree<T>& tree, const Callback& callback) {
40  const auto next = callback(tree.item);
41  for (const auto& i : tree.branches) {
42  detail::traverse_multitree(i, next);
43  }
44 }
45 
46 } // namespace detail
47 
48 template <typename T, typename Callback>
49 void traverse_multitree(const multitree<T>& tree, const Callback& callback) {
50  for (const auto& i : tree.branches) {
51  detail::traverse_multitree(i, callback);
52  }
53 }
54 
55 } // namespace raytracer
56 } // namespace wayverb
Definition: pressure.h:22
Definition: traits.h:46
Definition: capsule_base.h:9
Definition: multitree.h:13
Definition: recursive_vector.h:225