diff --git a/include/itkVkComplexToComplexFFTImageFilter.h b/include/itkVkComplexToComplexFFTImageFilter.h index 88870f84..76552fdc 100644 --- a/include/itkVkComplexToComplexFFTImageFilter.h +++ b/include/itkVkComplexToComplexFFTImageFilter.h @@ -127,6 +127,7 @@ struct FFTImageFilterTraits using InputPixelType = std::complex; template using OutputPixelType = std::complex; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkFFTImageFilterInitFactory.h b/include/itkVkFFTImageFilterInitFactory.h new file mode 100644 index 00000000..ce1892fe --- /dev/null +++ b/include/itkVkFFTImageFilterInitFactory.h @@ -0,0 +1,74 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * 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 itkVkFFTImageFilterInitFactory_h +#define itkVkFFTImageFilterInitFactory_h +#include "VkFFTBackendExport.h" + +#include "itkLightObject.h" + +namespace itk +{ +/** + *\class VkFFTImageFilterInitFactory + * \brief Initialize Vk FFT image filter factory backends. + * + * The purpose of VkFFTImageFilterInitFactory is to perform + * one-time registration of factory objects that handle + * creation of Vk-backend FFT image filter classes + * through the ITK object factory singleton mechanism. + * + * \ingroup FourierTransform + * \ingroup ITKFFT + * \ingroup ITKSystemObjects + * \ingroup VkFFTBackend + */ +class VkFFTBackend_EXPORT VkFFTImageFilterInitFactory : public LightObject +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(VkFFTImageFilterInitFactory); + + /** Standard class type aliases. */ + using Self = VkFFTImageFilterInitFactory; + using Superclass = LightObject; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + + /** Method for class instantiation. */ + itkFactorylessNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(VkFFTImageFilterInitFactory, LightObject); + + /** Mimic factory interface for Python initialization */ + static void + RegisterOneFactory() + { + RegisterFactories(); + } + + /** Register all Vk FFT factories */ + static void + RegisterFactories(); + +protected: + VkFFTImageFilterInitFactory(); + ~VkFFTImageFilterInitFactory() override = default; +}; +} // end namespace itk + +#endif diff --git a/include/itkVkForward1DFFTImageFilter.h b/include/itkVkForward1DFFTImageFilter.h index e28e94f6..231f59dd 100644 --- a/include/itkVkForward1DFFTImageFilter.h +++ b/include/itkVkForward1DFFTImageFilter.h @@ -134,6 +134,7 @@ struct FFTImageFilterTraits using InputPixelType = TUnderlying; template using OutputPixelType = std::complex; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkForwardFFTImageFilter.h b/include/itkVkForwardFFTImageFilter.h index fe1fc35a..328b8297 100644 --- a/include/itkVkForwardFFTImageFilter.h +++ b/include/itkVkForwardFFTImageFilter.h @@ -132,6 +132,7 @@ struct FFTImageFilterTraits using InputPixelType = TUnderlying; template using OutputPixelType = std::complex; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkHalfHermitianToRealInverseFFTImageFilter.h b/include/itkVkHalfHermitianToRealInverseFFTImageFilter.h index 25d5bbf8..6c992be5 100644 --- a/include/itkVkHalfHermitianToRealInverseFFTImageFilter.h +++ b/include/itkVkHalfHermitianToRealInverseFFTImageFilter.h @@ -133,6 +133,7 @@ struct FFTImageFilterTraits using InputPixelType = std::complex; template using OutputPixelType = TUnderlying; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkInverse1DFFTImageFilter.h b/include/itkVkInverse1DFFTImageFilter.h index 79c38039..855be9f5 100644 --- a/include/itkVkInverse1DFFTImageFilter.h +++ b/include/itkVkInverse1DFFTImageFilter.h @@ -135,6 +135,7 @@ struct FFTImageFilterTraits using InputPixelType = std::complex; template using OutputPixelType = TUnderlying; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkInverseFFTImageFilter.h b/include/itkVkInverseFFTImageFilter.h index 84ac7ac6..5d12653f 100644 --- a/include/itkVkInverseFFTImageFilter.h +++ b/include/itkVkInverseFFTImageFilter.h @@ -132,6 +132,7 @@ struct FFTImageFilterTraits using InputPixelType = std::complex; template using OutputPixelType = TUnderlying; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/include/itkVkRealToHalfHermitianForwardFFTImageFilter.h b/include/itkVkRealToHalfHermitianForwardFFTImageFilter.h index 454a7e28..91768c88 100644 --- a/include/itkVkRealToHalfHermitianForwardFFTImageFilter.h +++ b/include/itkVkRealToHalfHermitianForwardFFTImageFilter.h @@ -133,6 +133,7 @@ struct FFTImageFilterTraits using InputPixelType = TUnderlying; template using OutputPixelType = std::complex; + using FilterDimensions = std::integer_sequence; }; } // namespace itk diff --git a/itk-module.cmake b/itk-module.cmake index 5c74aa87..a676056c 100644 --- a/itk-module.cmake +++ b/itk-module.cmake @@ -25,6 +25,8 @@ itk_module(VkFFTBackend ITKImageIntensity DESCRIPTION "${DOCUMENTATION}" + FACTORY_NAMES + "FFTImageFilterInit::Vk" EXCLUDE_FROM_DEFAULT ENABLE_SHARED ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index edb57253..e5b97549 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ set(VkFFTBackend_SRCS itkVkCommon.cxx itkVkGlobalConfiguration.cxx + itkVkFFTImageFilterInitFactory.cxx ) itk_module_add_library(VkFFTBackend ${VkFFTBackend_SRCS}) diff --git a/src/itkVkFFTImageFilterInitFactory.cxx b/src/itkVkFFTImageFilterInitFactory.cxx new file mode 100644 index 00000000..132cdcaf --- /dev/null +++ b/src/itkVkFFTImageFilterInitFactory.cxx @@ -0,0 +1,67 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * 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. + * + *=========================================================================*/ +#include "ITKFFTExport.h" + +#include "itkVkComplexToComplex1DFFTImageFilter.h" +#include "itkVkComplexToComplexFFTImageFilter.h" +#include "itkFFTImageFilterFactory.h" +#include "itkVkForward1DFFTImageFilter.h" +#include "itkVkForwardFFTImageFilter.h" +#include "itkVkHalfHermitianToRealInverseFFTImageFilter.h" +#include "itkVkInverse1DFFTImageFilter.h" +#include "itkVkInverseFFTImageFilter.h" +#include "itkVkRealToHalfHermitianForwardFFTImageFilter.h" + +#include "itkVkFFTImageFilterInitFactory.h" + +namespace itk +{ +VkFFTImageFilterInitFactory::VkFFTImageFilterInitFactory() +{ + VkFFTImageFilterInitFactory::RegisterFactories(); +} + +void VkFFTImageFilterInitFactory::RegisterFactories() +{ + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); + itk::ObjectFactoryBase::RegisterFactory(FFTImageFilterFactory::New(), + itk::ObjectFactoryEnums::InsertionPosition::INSERT_AT_FRONT); +} + +// Undocumented API used to register during static initialization. +// DO NOT CALL DIRECTLY. +void VkFFTBackend_EXPORT +VkFFTImageFilterInitFactoryRegister__Private() +{ + VkFFTImageFilterInitFactory::RegisterFactories(); +} + +} // end namespace itk diff --git a/test/itkVkFFTImageFilterFactoryTest.cxx b/test/itkVkFFTImageFilterFactoryTest.cxx index a5f35b9a..a3151c4f 100644 --- a/test/itkVkFFTImageFilterFactoryTest.cxx +++ b/test/itkVkFFTImageFilterFactoryTest.cxx @@ -22,6 +22,7 @@ #include "itkComplexToComplex1DFFTImageFilter.h" #include "itkVkComplexToComplex1DFFTImageFilter.h" #include "itkVnlComplexToComplex1DFFTImageFilter.h" +#include "itkVkFFTImageFilterInitFactory.h" #include "itkFFTImageFilterFactory.h" #include "itkTestingMacros.h" @@ -63,5 +64,15 @@ itkVkFFTImageFilterFactoryTest(int, char *[]) ITK_TEST_EXPECT_TRUE(vnlFFT != nullptr); ITK_EXERCISE_BASIC_OBJECT_METHODS(vnlFFT, VnlComplexToComplex1DFFTImageFilter, ComplexToComplex1DFFTImageFilter); + // Verify factory initialization successfully registers factories + using FactoryInitializerType = itk::VkFFTImageFilterInitFactory; + FactoryInitializerType::RegisterFactories(); + + fft = FFTBaseType::New(); + vkFFT = dynamic_cast(fft.GetPointer()); + ITK_TEST_EXPECT_TRUE(vkFFT != nullptr); + ITK_EXERCISE_BASIC_OBJECT_METHODS(vkFFT, VkComplexToComplex1DFFTImageFilter, ComplexToComplex1DFFTImageFilter); + + return EXIT_SUCCESS; } diff --git a/wrapping/itkVkFFTImageFilterInitFactory.wrap b/wrapping/itkVkFFTImageFilterInitFactory.wrap new file mode 100644 index 00000000..52c1cc55 --- /dev/null +++ b/wrapping/itkVkFFTImageFilterInitFactory.wrap @@ -0,0 +1 @@ +itk_wrap_simple_class("itk::VkFFTImageFilterInitFactory" POINTER)