1 /* 2 * Medical Image Registration ToolKit (MIRTK) 3 * 4 * Copyright 2013-2015 Imperial College London 5 * Copyright 2013-2015 Andreas Schuh 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 #ifndef MIRTK_ImageWriterFactory_H 21 #define MIRTK_ImageWriterFactory_H 22 23 #include "mirtk/ObjectFactory.h" // New<BaseType, ObjectType>() 24 #include "mirtk/ImageWriter.h" 25 26 #include "mirtk/Array.h" 27 #include "mirtk/UnorderedMap.h" 28 29 30 31 namespace mirtk { 32 33 34 /** 35 * Factory for instantiation of image writers 36 */ 37 class ImageWriterFactory 38 { 39 // --------------------------------------------------------------------------- 40 // Types 41 public: 42 43 /// Type of object creator 44 typedef ImageWriter *(*ImageWriterCreator)(); 45 46 // --------------------------------------------------------------------------- 47 // Singleton 48 private: 49 50 /// Constructor 51 ImageWriterFactory(); 52 53 /// Destructor 54 ~ImageWriterFactory(); 55 56 /// Copy constructor. Intentionally not implemented. 57 ImageWriterFactory(const ImageWriterFactory &); 58 59 /// Assignment operator. Intentionally not implemented. 60 void operator =(const ImageWriterFactory &); 61 62 public: 63 64 /// Singleton instance 65 /// \attention This function is not thread-safe! 66 static ImageWriterFactory &Instance(); 67 68 69 private: 70 71 /// Type of associative map 72 typedef UnorderedMap<string, ImageWriterCreator> Associations; 73 74 /// Associates file name extensions with image writer creators 75 Associations _Associations; 76 77 public: 78 79 /// Register new image writer 80 /// 81 /// \param[in] exts File name extensions. 82 /// \param[in] creator Image writer instantiation function. 83 bool Register(const Array<string> &exts, ImageWriterCreator creator); 84 85 /// Construct new image writer for given output image file name 86 /// 87 /// \returns Image writer which is able to write an image in the format 88 /// corresponding to the given file name extension or nullptr 89 /// when no such writer is registered. 90 ImageWriter *New(const char *fname) const; 91 92 }; 93 94 // ----------------------------------------------------------------------------- 95 /// Register image reader with factory singleton 96 #define mirtkRegisterImageWriterMacro(type) \ 97 mirtk::ImageWriterFactory::Instance() \ 98 .Register(type::Extensions(), mirtk::New<mirtk::ImageWriter, type>) 99 100 // ----------------------------------------------------------------------------- 101 /// Register image reader with factory singleton at static initialization time 102 #ifdef MIRTK_AUTO_REGISTER 103 #define mirtkAutoRegisterImageWriterMacro(type) \ 104 namespace { \ 105 static auto _##type##Registered = \ 106 mirtk::ImageWriterFactory::Instance() \ 107 .Register(type::Extensions(), mirtk::New<mirtk::ImageWriter, type>); \ 108 } 109 #else // MIRTK_AUTO_REGISTER 110 #define mirtkAutoRegisterImageWriterMacro(type) 111 #endif // MIRTK_AUTO_REGISTER 112 113 114 115 } // namespace mirtk 116 117 #endif // MIRTK_ImageWriterFactory_H 118