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 itkCreateObjectFunction_h
19 #define itkCreateObjectFunction_h
20 
21 #include "itkObject.h"
22 
23 namespace itk
24 {
25 /** \class CreateObjectFunctionBase
26  *  \brief Define API for object creation callback functions.
27  *
28  * \ingroup ITKSystemObjects
29  * \ingroup ITKCommon
30  */
31 class ITKCommon_EXPORT CreateObjectFunctionBase:public Object
32 {
33 public:
34   ITK_DISALLOW_COPY_AND_ASSIGN(CreateObjectFunctionBase);
35 
36   /** Standard type alias. */
37   using Self = CreateObjectFunctionBase;
38   using Superclass = Object;
39   using Pointer = SmartPointer< Self >;
40   using ConstPointer = SmartPointer< const Self >;
41 
42   /** Create an object and return a pointer to it as an
43    * itk::LightObject. */
44   virtual SmartPointer< LightObject > CreateObject() = 0;
45 
46 protected:
47   CreateObjectFunctionBase();
48   ~CreateObjectFunctionBase() override;
49 };
50 
51 /** \class CreateObjectFunction
52  * \brief Used to create callback functions that create ITK Objects for
53  *        use with the itk::ObjectFactory.
54  *
55  * \ingroup ITKSystemObjects
56  * \ingroup ITKCommon
57  */
58 template< typename T >
59 class CreateObjectFunction:public CreateObjectFunctionBase
60 {
61 public:
62   ITK_DISALLOW_COPY_AND_ASSIGN(CreateObjectFunction);
63 
64   /** Standard class type aliases. */
65   using Self = CreateObjectFunction;
66   using Pointer = SmartPointer< Self >;
67 
68   /** Methods from itk:LightObject. */
69   itkFactorylessNewMacro(Self);
CreateObject()70   LightObject::Pointer CreateObject() override { return T::New().GetPointer(); }
71 
72 protected:
73   CreateObjectFunction() = default;
74   ~CreateObjectFunction() override = default;
75 };
76 } // end namespace itk
77 
78 #endif
79