CTL  0.6.1
Computed Tomography Library
serializationhelper.h
Go to the documentation of this file.
1 #ifndef CTL_SERIALIZATIONHELPER_H
2 #define CTL_SERIALIZATIONHELPER_H
3 
4 #include <QMap>
5 
6 class QVariant;
7 
8 namespace CTL {
9 
10 class AbstractDataModel;
11 class AbstractDataModel2D;
12 class AbstractPrepareStep;
13 class AbstractProjector;
14 class AbstractReconstructor;
15 class SystemComponent;
16 class SerializationInterface;
17 
25 {
26 public:
27  template<class SerializableType>
29  {
31  };
32 
33  // define type: pointer to function that creates CTL objects from a QVariant
34  typedef SerializationInterface* (*SerializableFactoryFunction)(const QVariant&);
35  typedef QMap<int, SerializableFactoryFunction> FactoryMap;
36 
37  static SerializationHelper& instance(); // singleton getter
38 
39  // maps with registered CTL type factories
40  const FactoryMap& componentFactories() const;
41  const FactoryMap& modelFactories() const;
42  const FactoryMap& model2DFactories() const;
43  const FactoryMap& prepareStepFactories() const;
44  const FactoryMap& projectorFactories() const;
45  const FactoryMap& reconstructorFactories() const;
46  const FactoryMap& miscFactories() const;
47 
48  // functions that parse the QVariant in order to create a concrete system component, data
49  // model, prepare step, or something else with SerializationInterface as base class
50  static AbstractDataModel* parseDataModel(const QVariant& variant);
51  static AbstractDataModel2D* parseDataModel2D(const QVariant& variant);
52  static SystemComponent* parseComponent(const QVariant& variant);
53  static AbstractPrepareStep* parsePrepareStep(const QVariant& variant);
54  static AbstractProjector* parseProjector(const QVariant& variant);
55  static AbstractReconstructor* parseReconstructor(const QVariant& variant);
56  static SerializationInterface* parseMiscObject(const QVariant& variant);
57 
58 private:
59  // private ctor & non-copyable
60  SerializationHelper() = default;
62  SerializationHelper& operator=(const SerializationHelper&) = delete;
63 
64  // generic parse function that uses a specified factory map to create an object
65  static SerializationInterface* parse(const QVariant& variant, const FactoryMap& factoryMap);
66 
67  // maps that map a type ID to a factory function
68  FactoryMap _componentFactories;
69  FactoryMap _modelFactories;
70  FactoryMap _model2DFactories;
71  FactoryMap _prepareStepFactories;
72  FactoryMap _miscFactories;
73  FactoryMap _projectorFactories;
74  FactoryMap _reconstructorFactories;
75 };
76 
77 template<class SerializableType>
79 {
80  auto factoryFunction = [](const QVariant& variant) -> SerializationInterface*
81  {
82  auto a = new SerializableType(); // requires a default constructor (can also be declared private)
83  a->fromVariant(variant);
84  return a;
85  };
86 
87  constexpr bool sysComponent = std::is_convertible<SerializableType*, SystemComponent*>::value;
88  constexpr bool dataModel = std::is_convertible<SerializableType*, AbstractDataModel*>::value;
89  constexpr bool dataModel2D = std::is_convertible<SerializableType*, AbstractDataModel2D*>::value;
90  constexpr bool prepStep = std::is_convertible<SerializableType*, AbstractPrepareStep*>::value;
91  constexpr bool projector = std::is_convertible<SerializableType*, AbstractProjector*>::value;
92  constexpr bool reconstructor = std::is_convertible<SerializableType*, AbstractReconstructor*>::value;
93  constexpr bool misc = std::is_convertible<SerializableType*, SerializationInterface*>::value;
94 
95  static_assert(sysComponent || dataModel || dataModel2D ||prepStep || projector || reconstructor || misc,
96  "RegisterWithSerializationHelper fails: tried a registration of an unknown type");
97 
98  auto& serializer = SerializationHelper::instance();
99  if(sysComponent)
100  {
101  Q_ASSERT(!serializer._componentFactories.contains(SerializableType::Type));
102  serializer._componentFactories.insert(SerializableType::Type, factoryFunction);
103  }
104  else if(dataModel)
105  {
106  Q_ASSERT(!serializer._modelFactories.contains(SerializableType::Type));
107  serializer._modelFactories.insert(SerializableType::Type, factoryFunction);
108  }
109  else if(dataModel2D)
110  {
111  Q_ASSERT(!serializer._model2DFactories.contains(SerializableType::Type));
112  serializer._model2DFactories.insert(SerializableType::Type, factoryFunction);
113  }
114  else if(prepStep)
115  {
116  Q_ASSERT(!serializer._prepareStepFactories.contains(SerializableType::Type));
117  serializer._prepareStepFactories.insert(SerializableType::Type, factoryFunction);
118  }
119  else if(projector)
120  {
121  Q_ASSERT(!serializer._projectorFactories.contains(SerializableType::Type));
122  serializer._projectorFactories.insert(SerializableType::Type, factoryFunction);
123  }
124  else if(reconstructor)
125  {
126  Q_ASSERT(!serializer._reconstructorFactories.contains(SerializableType::Type));
127  serializer._reconstructorFactories.insert(SerializableType::Type, factoryFunction);
128  }
129  else if(misc)
130  {
131  Q_ASSERT(!serializer._miscFactories.contains(SerializableType::Type));
132  serializer._miscFactories.insert(SerializableType::Type, factoryFunction);
133  }
134 }
135 
136 } // namespace CTL
137 
139 
170 #define DECLARE_SERIALIZABLE_TYPE(className_woNamespace) \
171  ::CTL::SerializationHelper::RegisterWithSerializationHelper<className_woNamespace> \
172  SERIALIZATION_HELPER_KNOWS_ ## className_woNamespace;
173 
175 #endif // CTL_SERIALIZATIONHELPER_H
The AbstractDataModel2D class is the base class for two-dimensional data models.
Definition: abstractdatamodel2d.h:47
Base class for preparation steps used within an AcquisitionSetup.
Definition: abstractpreparestep.h:46
The AbstractProjector class is the abstract base class defining the interfaces for forward projectors...
Definition: abstractprojector.h:68
Specify an interface for de-/serialization from/to QVariants.
Definition: serializationinterface.h:17
The AbstractReconstructor class defined the interface for reconstruction types.
Definition: abstractreconstructor.h:163
Base class for all system components.
Definition: systemcomponent.h:53
The AbstractDataModel class is the base class for basic data models.
Definition: abstractdatamodel.h:55
Singleton that manages factory functions for parsing QVariant(Maps) to CTL types.
Definition: serializationhelper.h:24