CTL  0.6.1
Computed Tomography Library
compositevolume.h
1 #ifndef CTL_COMPOSITEVOLUME_H
2 #define CTL_COMPOSITEVOLUME_H
3 
4 #include "abstractdynamicvolumedata.h"
5 
6 namespace CTL {
109 {
110 public:
112 
113  // variadic ctor for several volume types
114  template <class Volume, class... Volumes>
115  explicit CompositeVolume(Volume&& volume, Volumes&&... otherVolumes);
116 
117  // defaulted special member functions
118  CompositeVolume() = default;
119  CompositeVolume(const CompositeVolume& volume) = default;
120  CompositeVolume(CompositeVolume&& volume) = default;
121  CompositeVolume& operator=(const CompositeVolume& volume) = default;
122  CompositeVolume& operator=(CompositeVolume&& volume) = default;
123  ~CompositeVolume() = default;
124 
125  // getter methods
126  const std::vector<SubVolPtr>& data() const;
127  std::vector<SubVolPtr>& data();
128  bool isEmpty() const;
129  std::unique_ptr<SpectralVolumeData> muVolume(uint volIdx, float centerEnergy,
130  float binWidth) const;
131  uint nbSubVolumes() const;
132  const SpectralVolumeData& subVolume(uint volIdx) const;
134 
135  // other methods
136  void addSubVolume(SpectralVolumeData volume);
137  void addSubVolume(std::unique_ptr<SpectralVolumeData> volume);
138  void addSubVolume(const AbstractDynamicVolumeData& volume);
139  void addSubVolume(CompositeVolume&& volume);
140  void addSubVolume(const CompositeVolume& volume);
141  template <class Volume, class... Volumes>
142  void addSubVolumes(Volume&& volume, Volumes&&... otherVolumes);
143 
144 private:
145  void addSubVolumes() const {}
146  template <class Volume, class... Volumes>
147  static uint getTotalNbSubVolumes(const Volume& volume, const Volumes&... otherVolumes);
148  template <class Volume>
149  static constexpr uint getTotalNbSubVolumes(const Volume& volume);
150  static uint getTotalNbSubVolumes(const CompositeVolume& volume);
151 
152  std::vector<SubVolPtr> _subVolumes;
153 };
154 
184 template<class Volume, class... Volumes>
185 CompositeVolume::CompositeVolume(Volume&& volume, Volumes&&... otherVolumes)
186 {
187  addSubVolumes(std::forward<Volume>(volume), std::forward<Volumes>(otherVolumes)...);
188 }
189 
200 template <class Volume, class... Volumes>
201 void CompositeVolume::addSubVolumes(Volume&& volume, Volumes&&... otherVolumes)
202 {
203  _subVolumes.reserve(getTotalNbSubVolumes(*this, volume, otherVolumes...));
204 
205  addSubVolume(std::forward<Volume>(volume));
206  addSubVolumes(std::forward<Volumes>(otherVolumes)...);
207 }
208 
212 template <class Volume, class... Volumes>
213 uint CompositeVolume::getTotalNbSubVolumes(const Volume& volume, const Volumes&... otherVolumes)
214 {
215  return getTotalNbSubVolumes(volume) + getTotalNbSubVolumes(otherVolumes...);
216 }
217 
221 template <class Volume>
223 {
224  return 1u;
225 }
226 
232 {
233  return volume.nbSubVolumes();
234 }
235 
236 } // namespace CTL
237 
238 #endif // CTL_COMPOSITEVOLUME_H
bool isEmpty() const
Definition: compositevolume.cpp:65
std::unique_ptr< SpectralVolumeData > muVolume(uint volIdx, float centerEnergy, float binWidth) const
Definition: compositevolume.cpp:36
uint nbSubVolumes() const
Definition: compositevolume.cpp:44
const std::vector< SubVolPtr > & data() const
Definition: compositevolume.cpp:49
static uint getTotalNbSubVolumes(const Volume &volume, const Volumes &... otherVolumes)
Definition: compositevolume.h:213
void addSubVolumes(Volume &&volume, Volumes &&... otherVolumes)
Adds all data passed to this function as sub-volumes of the CompositeVolume.
Definition: compositevolume.h:201
The CompositeVolume class is a container to hold multiple volume datasets of any type from the CTL.
Definition: compositevolume.h:108
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
The SpectralVolumeData class holds voxelized data (for a single material) along with information on i...
Definition: spectralvolumedata.h:40
void addSubVolume(SpectralVolumeData volume)
Definition: compositevolume.cpp:84
const SpectralVolumeData & subVolume(uint volIdx) const
Definition: compositevolume.cpp:21
Extends std::unique_ptr<T> with copy operations using the clone method of type T.
Definition: copyableuniqueptr.h:14
Definition: abstractdynamicvolumedata.h:14
std::vector< SubVolPtr > _subVolumes
the managed sub-volumes.
Definition: compositevolume.h:152