CORSIKA  @c8_version@
The framework to simulate particle cascades for astroparticle physics
VolumeTreeNode.hpp
1 /*
2  * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
3  *
4  * This software is distributed under the terms of the GNU General Public
5  * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
6  * the license.
7  */
8 
9 #pragma once
10 
11 #include <corsika/framework/geometry/IVolume.hpp>
12 #include <corsika/media/IEmpty.hpp>
13 #include <memory>
14 #include <vector>
15 
16 namespace corsika {
17 
18  template <typename TModelProperties = IEmpty>
20 
21  public:
22  using IModelProperties = TModelProperties;
24  using VTNUPtr = std::unique_ptr<VTN_type>;
25  using IMPSharedPtr = std::shared_ptr<IModelProperties>;
26  using VolUPtr = std::unique_ptr<IVolume>;
27 
28  VolumeTreeNode(VolUPtr pVolume = nullptr)
29  : geoVolume_(std::move(pVolume)) {}
30 
32  bool contains(Point const& p) const;
33 
34  VolumeTreeNode<IModelProperties> const* excludes(Point const& p) const;
35 
39  VolumeTreeNode<IModelProperties> const* getContainingNode(Point const& p) const;
40 
46  template <typename TCallable, bool preorder = true>
47  void walk(TCallable func) const;
48 
49  void addChild(VTNUPtr pChild);
50 
51  void excludeOverlapWith(VTNUPtr const& pNode);
52 
53  VTN_type const* getParent() const { return parentNode_; };
54 
55  auto const& getChildNodes() const { return childNodes_; }
56 
57  auto const& getExcludedNodes() const { return excludedNodes_; }
58 
59  auto const& getVolume() const { return *geoVolume_; }
60 
61  auto const& getModelProperties() const { return *modelProperties_; }
62 
63  bool hasModelProperties() const { return modelProperties_.get() != nullptr; }
64 
65  template <typename ModelProperties, typename... Args>
66  auto setModelProperties(Args&&... args) {
67  // static_assert(std::is_base_of_v<IModelProperties, ModelProperties>,
68  // "unusable type provided");
69  modelProperties_ = std::make_shared<ModelProperties>(std::forward<Args>(args)...);
70  return modelProperties_;
71  }
72 
73  void setModelProperties(IMPSharedPtr ptr) { modelProperties_ = ptr; }
74 
75  // template <class MediumType, typename... Args>
76  // static auto createMedium(Args&&... args);
77 
78  private:
79  std::vector<VTNUPtr> childNodes_;
80  std::vector<VTN_type const*> excludedNodes_;
81  VTN_type const* parentNode_ = nullptr;
82  VolUPtr geoVolume_;
83  IMPSharedPtr modelProperties_;
84  };
85 
86 } // namespace corsika
87 
88 #include <corsika/detail/media/VolumeTreeNode.inl>
void walk(TCallable func) const
Traverses the VolumeTree pre- or post-order and calls the functor func for each node.
bool contains(Point const &p) const
convenience function equivalent to Volume::isInside
`, since they are used everywhere as integral part of the framework.