1 /*=========================================================================
2  *
3  *  Copyright Insight Software Consortium
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *         http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkImageVectorOptimizerParametersHelper_h
19 #define itkImageVectorOptimizerParametersHelper_h
20 
21 #include "itkOptimizerParametersHelper.h"
22 #include "itkImage.h"
23 
24 namespace itk
25 {
26 /** \class ImageVectorOptimizerParametersHelper
27  *  \brief Class to hold and manage parameters of type
28  *          Image<Vector<...>,...>, used in Transforms, etc.
29  *
30  *  \sa OptimizerParametersHelper
31  *  \ingroup ITKCommon
32  */
33 
34 /* Can we template of Image type instead, but require that Image be of type
35  * Image< Vector< TValue, NVectorDimension >, VImageDimension > ? */
36 template< typename TValue,
37           unsigned int NVectorDimension,
38           unsigned int VImageDimension >
39 class ITK_TEMPLATE_EXPORT ImageVectorOptimizerParametersHelper
40   : public OptimizerParametersHelper< TValue >
41 {
42 public:
43 
44   /** The element type stored at each location in the Array. */
45   using ValueType = TValue;
46   using Self = ImageVectorOptimizerParametersHelper;
47   using Superclass = OptimizerParametersHelper< TValue >;
48 
49   /** Image type that this class expects. */
50   using ParameterImageType = Image< Vector<TValue, NVectorDimension>,
51                  VImageDimension >;
52   using ParameterImagePointer = typename ParameterImageType::Pointer;
53 
54   /** Type of the common data object used in OptimizerParameters */
55   using CommonContainerType = typename Superclass::CommonContainerType;
56 
57   /** Default constructor. */
58   ImageVectorOptimizerParametersHelper();
59 
60   /** Set a new data pointer for *both* the Array and parameter image,
61    * pointing both to a different memory block.
62    * The size of the new memroy block must be the same as current size of
63    * Array and the parameter image's buffer, in elements of TValue.
64    * Memory must be managed by caller afterwards. */
65   void MoveDataPointer(CommonContainerType* container,
66                                TValue * pointer ) override;
67 
68   /** Set an image that holds the parameter data. \c container is a pointer
69    * of type itkArray to the object to which this helper is assigned.
70    *\c container will be pointed to the image data buffer, and set not to
71    * manage memory, so the image still manages its memory.
72    * A dynamic cast is performed on \c object to make sure its of proper type.
73    * Generally this will be called from
74    * OptimizerParameters::SetParameterObject. */
75   void SetParametersObject(CommonContainerType * container,
76                                    LightObject * ) override;
77 
78   ~ImageVectorOptimizerParametersHelper() override = default;
79 
80 private:
81   /** The parameter image used by the class */
82   ParameterImagePointer           m_ParameterImage;
83 
84 };
85 
86 }//namespace itk
87 
88 #ifndef ITK_MANUAL_INSTANTIATION
89 #include "itkImageVectorOptimizerParametersHelper.hxx"
90 #endif
91 
92 #endif
93