File: elxComponentDatabase.h

package info (click to toggle)
elastix 5.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 45,644 kB
  • sloc: cpp: 85,720; lisp: 4,118; python: 1,045; sh: 200; xml: 182; makefile: 33
file content (131 lines) | stat: -rw-r--r-- 4,472 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*=========================================================================
 *
 *  Copyright UMC Utrecht and contributors
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/

#ifndef elxComponentDatabase_h
#define elxComponentDatabase_h

#include "itkObject.h"
#include "itkObjectFactory.h"
#include <iostream>
#include <string>
#include <utility>
#include <map>

namespace elastix
{

/**
 * \class ComponentDatabase
 *
 * \brief The ComponentDatabase class is a class that stores the
 * New() functions of all components.
 *
 * In elastix the metric/transform/dimension/pixeltype etc. are all selected
 * at runtime. To make this possible, all components (metric/transform etc)
 * have to compiled for different dimension/pixeltype. The elx::ComponentDatabase
 * stores for each instance and each pixeltype/dimension a pointers to a function
 * that creates a component of the specific type.
 *
 * Each new component (a new metric for example should "make itself
 * known" by calling the elxInstallMacro, which is defined in
 * elxMacro.h .
 *
 * \sa elxInstallFunctions
 * \ingroup Install
 */

class ComponentDatabase : public itk::Object
{
public:
  ITK_DISALLOW_COPY_AND_MOVE(ComponentDatabase);

  /** Standard.*/
  using Self = ComponentDatabase;
  using Superclass = itk::Object;
  using Pointer = itk::SmartPointer<Self>;
  using ConstPointer = itk::SmartPointer<const Self>;

  itkNewMacro(Self);
  itkOverrideGetNameOfClassMacro(ComponentDatabase);

  /** The Index is the number of the ElastixTypedef<number>::ElastixType.*/
  using IndexType = unsigned int;

  /** Typedefs for the CreatorMap*/
  using ObjectPointer = itk::Object::Pointer;

  /** PtrToCreator is a pointer to a function which
   * outputs an ObjectPointer and has no input arguments.
   */
  using PtrToCreator = ObjectPointer (*)();
  using ComponentDescriptionType = std::string;
  using CreatorMapKeyType = std::pair<ComponentDescriptionType, IndexType>;
  using CreatorMapValueType = PtrToCreator;
  using CreatorMapType = std::map<CreatorMapKeyType, CreatorMapValueType>;
  using CreatorMapEntryType = CreatorMapType::value_type;

  /** Typedefs for the IndexMap.*/

  /** The ImageTypeDescription contains the pixeltype (as a string)
   * and the dimension (unsigned int).
   */
  using PixelTypeDescriptionType = std::string;
  using ImageDimensionType = unsigned int;
  using ImageTypeDescriptionType = std::pair<PixelTypeDescriptionType, ImageDimensionType>;

  /** This pair contains the ImageTypeDescription of the FixedImageType
   * and the MovingImageType.
   */
  using IndexMapKeyType = std::pair<ImageTypeDescriptionType, ImageTypeDescriptionType>;
  using IndexMapValueType = IndexType;
  using IndexMapType = std::map<IndexMapKeyType, IndexMapValueType>;
  using IndexMapEntryType = IndexMapType::value_type;

  /** Functions to set an entry in a map.*/
  int
  SetCreator(const ComponentDescriptionType & name, IndexType i, PtrToCreator creator);

  int
  SetIndex(const PixelTypeDescriptionType & fixedPixelType,
           ImageDimensionType               fixedDimension,
           const PixelTypeDescriptionType & movingPixelType,
           ImageDimensionType               movingDimension,
           IndexType                        i);

  /** Functions to get an entry in a map */
  PtrToCreator
  GetCreator(const ComponentDescriptionType & name, IndexType i) const;

  IndexType
  GetIndex(const PixelTypeDescriptionType & fixedPixelType,
           ImageDimensionType               fixedDimension,
           const PixelTypeDescriptionType & movingPixelType,
           ImageDimensionType               movingDimension) const;

protected:
  ComponentDatabase() = default;
  ~ComponentDatabase() override = default;

private:
  CreatorMapType CreatorMap;
  IndexMapType   IndexMap;
};

} // end namespace elastix

#endif // end #ifndef elxComponentDatabase_h