CTL  0.6.1
Computed Tomography Library
abstractdatamodel.h
Go to the documentation of this file.
1 #ifndef CTL_ABSTRACTDATAMODEL_H
2 #define CTL_ABSTRACTDATAMODEL_H
3 
5 #include "copyableuniqueptr.h"
6 
7 namespace CTL {
8 
56 {
58 
59  // abstract interface
60  public:virtual float valueAt(float position) const = 0;
61  public:virtual AbstractDataModel* clone() const = 0;
62 
63 public:
64  virtual QVariant parameter() const;
65  virtual void setParameter(const QVariant& parameter);
66 
67  void fromVariant(const QVariant& variant) override;
68  QVariant toVariant() const override;
69 
70  bool isIntegrable() const;
71 
72  void setName(const QString& name);
73  const QString& name() const;
74 
75  ~AbstractDataModel() override = default;
76 
77 private:
78  QString _name;
79 
80 protected:
81  AbstractDataModel() = default;
82  AbstractDataModel(const AbstractDataModel&) = default;
84  AbstractDataModel& operator=(const AbstractDataModel&) = default;
85  AbstractDataModel& operator=(AbstractDataModel&&) = default;
86 };
87 
88 // Data model operators
89 std::shared_ptr<AbstractDataModel> operator+(std::shared_ptr<AbstractDataModel> lhs,
90  std::shared_ptr<AbstractDataModel> rhs);
91 std::shared_ptr<AbstractDataModel> operator-(std::shared_ptr<AbstractDataModel> lhs,
92  std::shared_ptr<AbstractDataModel> rhs);
93 std::shared_ptr<AbstractDataModel> operator*(std::shared_ptr<AbstractDataModel> lhs,
94  std::shared_ptr<AbstractDataModel> rhs);
95 std::shared_ptr<AbstractDataModel> operator/(std::shared_ptr<AbstractDataModel> lhs,
96  std::shared_ptr<AbstractDataModel> rhs);
97 std::shared_ptr<AbstractDataModel> operator|(std::shared_ptr<AbstractDataModel> lhs,
98  std::shared_ptr<AbstractDataModel> rhs);
99 std::shared_ptr<AbstractDataModel>& operator+=(std::shared_ptr<AbstractDataModel>& lhs,
100  const std::shared_ptr<AbstractDataModel>& rhs);
101 std::shared_ptr<AbstractDataModel>& operator-=(std::shared_ptr<AbstractDataModel>& lhs,
102  const std::shared_ptr<AbstractDataModel>& rhs);
103 std::shared_ptr<AbstractDataModel>& operator*=(std::shared_ptr<AbstractDataModel>& lhs,
104  const std::shared_ptr<AbstractDataModel>& rhs);
105 std::shared_ptr<AbstractDataModel>& operator/=(std::shared_ptr<AbstractDataModel>& lhs,
106  const std::shared_ptr<AbstractDataModel>& rhs);
107 std::shared_ptr<AbstractDataModel>& operator|=(std::shared_ptr<AbstractDataModel>& lhs,
108  const std::shared_ptr<AbstractDataModel>& rhs);
109 
111 {
112  // abstract interface
113  public:virtual float binIntegral(float position, float binWidth) const = 0;
114  public:virtual AbstractIntegrableDataModel* clone() const override = 0;
115 
116 public:
117  ~AbstractIntegrableDataModel() override = default;
118 
119  float meanValue(float position, float binWidth) const;
120 
121 protected:
122  AbstractIntegrableDataModel() = default;
125  AbstractIntegrableDataModel& operator=(const AbstractIntegrableDataModel&) = default;
127 };
128 
129 // Operators for integrable data models
130 std::shared_ptr<AbstractIntegrableDataModel>
131 operator+(std::shared_ptr<AbstractIntegrableDataModel> lhs,
132  std::shared_ptr<AbstractIntegrableDataModel> rhs);
133 std::shared_ptr<AbstractIntegrableDataModel>
134 operator-(std::shared_ptr<AbstractIntegrableDataModel> lhs,
135  std::shared_ptr<AbstractIntegrableDataModel> rhs);
136 std::shared_ptr<AbstractIntegrableDataModel>&
137 operator+=(std::shared_ptr<AbstractIntegrableDataModel>& lhs,
138  const std::shared_ptr<AbstractIntegrableDataModel>& rhs);
139 std::shared_ptr<AbstractIntegrableDataModel>&
140 operator-=(std::shared_ptr<AbstractIntegrableDataModel>& lhs,
141  const std::shared_ptr<AbstractIntegrableDataModel>& rhs);
142 
143 // resolve ambiguity for integrable data model operators
144 template <typename DataModel1, typename DataModel2>
145 auto operator+(std::shared_ptr<DataModel1> lhs, std::shared_ptr<DataModel2> rhs) ->
146  typename std::enable_if<
147  std::is_convertible<DataModel1*, AbstractIntegrableDataModel*>::value
148  && std::is_convertible<DataModel2*, AbstractIntegrableDataModel*>::value,
149  std::shared_ptr<AbstractIntegrableDataModel>>::type
150 {
151  return std::shared_ptr<AbstractIntegrableDataModel>(std::move(lhs))
152  + std::shared_ptr<AbstractIntegrableDataModel>(std::move(rhs));
153 }
154 template <typename DataModel1, typename DataModel2>
155 auto operator-(std::shared_ptr<DataModel1> lhs, std::shared_ptr<DataModel2> rhs) ->
156  typename std::enable_if<
157  std::is_convertible<DataModel1*, AbstractIntegrableDataModel*>::value
158  && std::is_convertible<DataModel2*, AbstractIntegrableDataModel*>::value,
159  std::shared_ptr<AbstractIntegrableDataModel>>::type
160 {
161  return std::shared_ptr<AbstractIntegrableDataModel>(std::move(lhs))
162  - std::shared_ptr<AbstractIntegrableDataModel>(std::move(rhs));
163 }
164 
165 // Declare DataModelPtr (copyable unique_ptr)
166 template <class ModelType, class =
167  typename std::enable_if<std::is_convertible<ModelType*, AbstractDataModel*>::value>::type>
168 using DataModelPtr = CopyableUniquePtr<ModelType>;
169 
170 using AbstractDataModelPtr = DataModelPtr<AbstractDataModel>;
171 
172 // factory function `makeDataModel`
173 template <typename ModelType, typename... ConstructorArguments>
174 auto makeDataModel(ConstructorArguments&&... arguments) ->
175  typename std::enable_if<std::is_convertible<ModelType*, AbstractDataModel*>::value,
176  std::unique_ptr<ModelType>>::type
177 {
178  return std::unique_ptr<ModelType>(
179  new ModelType(std::forward<ConstructorArguments>(arguments)...));
180 }
181 
182 } // namespace CTL
183 
185 
221 
223 
224 #endif // CTL_ABSTRACTDATAMODEL_H
virtual AbstractDataModel * clone() const =0
void setName(const QString &name)
Definition: abstractdatamodel.cpp:14
DataModelPtr
Template alias name for CopyableUniquePtr<ModelType> to a suitable ModelType.
virtual void setParameter(const QVariant &parameter)
Definition: abstractdatamodel.cpp:12
const QString & name() const
Definition: abstractdatamodel.cpp:16
Specify an interface for de-/serialization from/to QVariants.
Definition: serializationinterface.h:17
virtual float valueAt(float position) const =0
The AbstractDataModel class is the base class for basic data models.
Definition: abstractdatamodel.h:55
bool isIntegrable() const
Definition: abstractdatamodel.cpp:50
std::unique_ptr< ModelType > makeDataModel(ConstructorArguments &&... arguments)
Definition: abstractdatamodel.h:174
#define CTL_TYPE_ID(newIndex)
Definition: serializationinterface.h:189
virtual QVariant parameter() const
Definition: abstractdatamodel.cpp:10
void fromVariant(const QVariant &variant) override
Definition: abstractdatamodel.cpp:31
int type() const override
Definition: abstractdatamodel.h:57
AbstractDataModelPtr
Alias name for DataModelPtr<AbstractDataModel>.
The AbstractIntegrableDataModel class is the base class for data models that provide a means to integ...
Definition: abstractdatamodel.h:110
QVariant toVariant() const override
Definition: abstractdatamodel.cpp:19