CTL  0.6.1
Computed Tomography Library
projectorextension.h
Go to the documentation of this file.
1 #ifndef CTL_PROJECTOREXTENSION_H
2 #define CTL_PROJECTOREXTENSION_H
3 
4 #include "abstractprojector.h"
5 #include <memory>
6 
7 namespace CTL {
137 {
139 
140 protected:
141  class MetaProjector;
142 
143  // abstract interface
144  public: void configure(const AcquisitionSetup& setup) override;
145  public: ProjectionData project(const VolumeData& volume) override;
146 
147 public:
148  explicit ProjectorExtension(AbstractProjector* projector = nullptr);
149  explicit ProjectorExtension(std::unique_ptr<AbstractProjector> projector);
150 
151  // virtual methods
152  ProjectionData projectComposite(const CompositeVolume& volume) override;
153  ProjectionData projectSparse(const SparseVoxelVolume& volume) override;
154  bool isLinear() const override;
155  virtual void use(AbstractProjector* other);
156  void use(std::unique_ptr<AbstractProjector> other);
157 
158  // SerializationInterface interface
159  void fromVariant(const QVariant &variant) override;
160  QVariant toVariant() const override;
161 
162  // other methods
164  void reset();
165 
166 protected:
167  virtual ProjectionData extendedProject(const MetaProjector& nestedProjector);
168 
169 private:
170  std::unique_ptr<AbstractProjector> _projector;
171 };
172 
174 {
175 public:
176  MetaProjector(const VolumeData& volume, AbstractProjector* projector);
177  MetaProjector(const CompositeVolume& volume, AbstractProjector* projector);
178  MetaProjector(const SparseVoxelVolume& volume, AbstractProjector* projector);
179 
180  ProjectionData project() const;
181  bool isComposite() const;
182  bool isSparse() const;
183 
184 private:
186  const VolumeData* _simpleVolume;
187  const CompositeVolume* _compositeVolume;
188  const SparseVoxelVolume* _sparseVolume;
189 };
190 
191 // pipe operators
192 // u_ptr, u_ptr
193 template<class ProjectorExtensionType>
194 auto operator|(std::unique_ptr<AbstractProjector> lhs,
195  std::unique_ptr<ProjectorExtensionType> rhs) ->
196 typename std::enable_if<std::is_convertible<ProjectorExtensionType*, ProjectorExtension*>::value,
197  std::unique_ptr<ProjectorExtensionType>>::type
198 {
199  rhs->use(std::move(lhs));
200  return rhs;
201 }
202 
203 // u_ptr, raw_ptr
204 template<class ProjectorExtensionType>
205 auto operator|(std::unique_ptr<AbstractProjector> lhs,
206  ProjectorExtensionType* rhs) ->
207 typename std::enable_if<std::is_convertible<ProjectorExtensionType*, ProjectorExtension*>::value,
208  std::unique_ptr<ProjectorExtensionType>>::type
209 {
210  rhs->use(std::move(lhs));
211  return std::unique_ptr<ProjectorExtensionType>{ rhs };
212 }
213 
214 // raw_ptr, u_ptr
215 template<class ProjectorExtensionType>
216 auto operator|(AbstractProjector* lhs,
217  std::unique_ptr<ProjectorExtensionType> rhs) ->
218 typename std::enable_if<std::is_convertible<ProjectorExtensionType*, ProjectorExtension*>::value,
219  std::unique_ptr<ProjectorExtensionType>>::type
220 {
221  rhs->use(lhs);
222  return rhs;
223 }
224 
225 // u_ptr, u_ptr
226 std::unique_ptr<AbstractProjector>& operator|=(std::unique_ptr<AbstractProjector>& lhs,
227  std::unique_ptr<ProjectorExtension> rhs);
228 std::unique_ptr<ProjectorExtension>& operator|=(std::unique_ptr<ProjectorExtension>& lhs,
229  std::unique_ptr<ProjectorExtension> rhs);
230 // u_ptr, raw_ptr
231 std::unique_ptr<AbstractProjector>& operator|=(std::unique_ptr<AbstractProjector>& lhs,
232  ProjectorExtension* rhs);
233 std::unique_ptr<ProjectorExtension>& operator|=(std::unique_ptr<ProjectorExtension>& lhs,
234  ProjectorExtension* rhs);
235 // raw_ptr, u_ptr
236 AbstractProjector*& operator|=(AbstractProjector*& lhs,
237  std::unique_ptr<ProjectorExtension> rhs);
238 ProjectorExtension*& operator|=(ProjectorExtension*& lhs,
239  std::unique_ptr<ProjectorExtension> rhs);
240 // raw_ptr, raw_ptr
241 AbstractProjector*& pipe(AbstractProjector*& lhs, ProjectorExtension* rhs);
243 
244 
245 // factory function `makeExtension` (2 overloads, one for each ctor)
246 template <typename ProjectorExtensionType>
247 auto makeExtension(AbstractProjector* projector = nullptr) ->
248 typename std::enable_if<std::is_convertible<ProjectorExtensionType*, ProjectorExtension*>::value,
249  std::unique_ptr<ProjectorExtensionType>>::type
250 {
251  return std::unique_ptr<ProjectorExtensionType>(new ProjectorExtensionType(projector));
252 }
253 
254 template <typename ProjectorExtensionType>
255 auto makeExtension(std::unique_ptr<AbstractProjector> projector) ->
256 typename std::enable_if<std::is_convertible<ProjectorExtensionType*, ProjectorExtension*>::value,
257  std::unique_ptr<ProjectorExtensionType>>::type
258 {
259  return std::unique_ptr<ProjectorExtensionType>(
260  new ProjectorExtensionType(std::move(projector)));
261 }
262 
263 } // namespace CTL
264 
266 
284 
286 #endif // CTL_PROJECTOREXTENSION_H
void configure(const AcquisitionSetup &setup) override
Definition: projectorextension.cpp:114
void fromVariant(const QVariant &variant) override
Sets the contents of the object based on the QVariant variant.
Definition: projectorextension.cpp:172
int type() const override
Definition: projectorextension.h:138
virtual ProjectionData extendedProject(const MetaProjector &nestedProjector)
Definition: projectorextension.cpp:67
ProjectorExtension(AbstractProjector *projector=nullptr)
Definition: projectorextension.cpp:78
Holds a CTSystem together with the information about the system settings for all views from which pro...
Definition: acquisitionsetup.h:175
bool isLinear() const override
Returns true if the projection operation is linear.
Definition: projectorextension.cpp:163
The ProjectionData class is the container class used to store all projections from all views.
Definition: projectiondata.h:19
Definition: sparsevoxelvolume.h:14
Definition: projectorextension.h:173
The AbstractProjector class is the abstract base class defining the interfaces for forward projectors...
Definition: abstractprojector.h:68
AbstractProjector * release()
Definition: projectorextension.cpp:199
ProjectionData projectComposite(const CompositeVolume &volume) override
Provides the functionality to forward project CompositeVolume data.
Definition: projectorextension.cpp:143
The CompositeVolume class is a container to hold multiple volume datasets of any type from the CTL.
Definition: compositevolume.h:108
QVariant toVariant() const override
Stores the contents of this instance in a QVariant.
Definition: projectorextension.cpp:183
void reset()
Definition: projectorextension.cpp:211
#define CTL_TYPE_ID(newIndex)
Definition: serializationinterface.h:189
The SpectralVolumeData class holds voxelized data (for a single material) along with information on i...
Definition: spectralvolumedata.h:40
std::unique_ptr< AbstractProjector > _projector
The nested projector object.
Definition: projectorextension.h:170
ProjectionData project(const VolumeData &volume) override
Definition: projectorextension.cpp:131
virtual void use(AbstractProjector *other)
Definition: projectorextension.cpp:223
The ProjectorExtension class provides the interface to extend projectors with additional functionalit...
Definition: projectorextension.h:136
ProjectionData projectSparse(const SparseVoxelVolume &volume) override
Provides the functionality to forward project SparseVoxelVolume data.
Definition: projectorextension.cpp:153
std::unique_ptr< ProjectorExtensionType > makeExtension(AbstractProjector *projector=nullptr)
Definition: projectorextension.h:247