1 /*=========================================================================
4 Module: $RCSfile: bbtkPackage.h,v $
6 Date: $Date: 2008/01/30 09:28:15 $
7 Version: $Revision: 1.2 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See doc/license.txt or
11 http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
20 * \brief Class bbtk::Package : registers black boxes descriptors and is able to create instances of the black boxes registered.
23 * \class bbtk::Package
24 * \brief registers black boxes descriptors and is able to create instances of the black boxes registered.
27 #ifndef __bbtkPackage_h__
28 #define __bbtkPackage_h__
30 #include "bbtkBlackBox.h"
35 class BBTK_EXPORT Package
38 Package(const std::string& name,
39 const std::string& author,
40 const std::string& description,
41 const std::string& version,
42 const std::string& BBTKVersion);
44 /// Returns the name of the package
45 const std::string& GetName() const { return mName; }
47 /// Returns the author of the package
48 const std::string& GetAuthor() const { return mAuthor; }
50 /// Returns the keyword of the package
51 const std::string& GetKeyword() const { return mKeyword; }
53 /// Returns the description of the package
54 const std::string& GetDescription() const { return mDescription; }
56 /// Returns the version of the package
57 const std::string& GetVersion() const { return mVersion; }
59 /// Returns the version of bbtk used to build the package
60 const std::string& GetBBTKVersion() const { return mBBTKVersion; }
62 bool ContainsBlackBox(const std::string& boxname) const;
65 BlackBox* NewBlackBox(const std::string& type,
66 const std::string& name) const;
68 BlackBox* NewAdaptor(TypeInfo typein,
70 const std::string& name) const;
72 bool RegisterBlackBox(BlackBoxDescriptor*);
73 void UnRegisterBlackBox(const std::string& name);
75 // bool RegisterAdaptor(BlackBoxDescriptor*);
77 void PrintBlackBoxes(bool description = false,
78 bool adaptors = false) const;
79 void PrintAdaptors(bool description = false) const;
80 void HelpBlackBox(const std::string& name, bool full=true) const;
82 void CreateHtmlPage(const std::string& filename,
83 const std::string& caller = "?",
84 const std::string& source = "?",
85 const std::string& custom_header = "",
86 const std::string& custom_title = "",
89 bool relative_link = false ) const;
91 void SetDocURL(std::string url){ mDocURL=url; }
92 const std::string& GetDocURL() const { return mDocURL; }
94 void SetDocRelativeURL(std::string url){ mDocRelativeURL=url; }
95 const std::string& GetDocRelativeURL() const { return mDocRelativeURL; }
98 unsigned int GetNumberOfBlackBoxes() const { return mBlackBoxMap.size(); }
100 /// Changes the name of a black box type
101 void ChangeBlackBoxName( const std::string& oldname,
102 const std::string& newname );
105 /// The name of the package
107 /// The author of the package
109 /// The keywords of the package
110 std::string mKeyword;
111 /// The description of the package
112 std::string mDescription;
113 /// The version of the package
114 std::string mVersion;
115 /// The version of the library bbtk used to build the package
116 std::string mBBTKVersion;
117 /// URL of the documentation of the Package (absolute path)
119 /// URL of the documentation of the Package
120 /// (path relative to bbtk doc root)
121 std::string mDocRelativeURL;
124 /// The type of map of descriptors
125 typedef std::map< std::string, BlackBoxDescriptor*> BlackBoxMapType;
126 /// The map of black boxes descriptors
127 BlackBoxMapType mBlackBoxMap;
129 /// The type of key in the map of adaptor descriptors
133 AdaptorKey( TypeInfo typein, TypeInfo typeout)
134 : mTypeIn(typein.name()), mTypeOut(typeout.name()) {}
136 bool operator< ( const AdaptorKey& k ) const
138 // return ( ( mTypeIn.before(k.mTypeIn) ) ||
139 // ( ( mTypeIn == k.mTypeIn ) &&
140 // ( mTypeOut.before(k.mTypeOut) ) ) );
141 return ( ( mTypeIn < k.mTypeIn ) ||
142 ( ( mTypeIn == k.mTypeIn ) &&
143 ( mTypeOut < k.mTypeOut ) ) );
148 // TypeInfo mTypeOut;
150 std::string mTypeOut;
153 //typedef std::string AdaptorKey;
155 /// The type of map of adaptor descriptors
156 typedef std::map< AdaptorKey, BlackBoxDescriptor*> AdaptorMapType;
158 /// The map of adaptors descriptors
159 AdaptorMapType mAdaptorMap;
162 //====================================================================
165 //====================================================================
167 #define BBTK_PACKAGE_EXPORT __declspec( dllexport )
169 #define BBTK_PACKAGE_EXPORT
170 #endif // defined(_WIN32)
171 //====================================================================
173 //====================================================================
174 #define BBTK_DECLARE_PACKAGE(NAME) \
177 bbtk::Package*& NAME ## GetPackagePointer(); \
178 BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage(); \
179 BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage(); \
181 //====================================================================
183 //====================================================================
184 #define BBTK_IMPLEMENT_PACKAGE(NAME,AUTHOR,DESCRIPTION,VERSION) \
187 bbtk::Package*& NAME ## GetPackagePointer() \
189 static bbtk::Package* u = 0; \
192 BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage() \
194 if (NAME ## GetPackagePointer()) \
195 delete NAME ## GetPackagePointer(); \
196 NAME ## GetPackagePointer() = 0; \
198 BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage() \
200 if (!NAME ## GetPackagePointer()) \
201 NAME ## GetPackagePointer() = \
202 new bbtk::Package(#NAME, \
206 BBTK_STRINGIFY_SYMBOL(BBTK_VERSION) \
208 return NAME ## GetPackagePointer(); \
211 //====================================================================
213 //====================================================================
214 #define BBTK_ADD_BLACK_BOX_TO_PACKAGE(NAME,CLASS) \
215 bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor());
216 //====================================================================
218 //====================================================================
219 #define BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
220 bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor());
221 //====================================================================
223 //====================================================================
224 #define BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(NAME,CLASS,T1,T2) \
225 bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor());
226 //====================================================================
228 //====================================================================
229 //#define BBTK_ADD_ADAPTOR_TO_PACKAGE(NAME,CLASS) \
230 // bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor()); \
231 // bool bbDummyAdaptor##NAME##CLASS = NAME ## GetPackage()->RegisterAdaptor(CLASS::bbDescriptor());
232 //====================================================================
234 //====================================================================
235 //#define BBTK_ADD_TEMPLATE_ADAPTOR_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
236 // bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor()); \
237 // bool bbDummyAdaptor##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterAdaptor(CLASS<TEMPLATE_PARAM>::bbDescriptor());
238 //====================================================================
240 //====================================================================
241 //#define BBTK_ADD_TEMPLATE2_ADAPTOR_TO_PACKAGE(NAME,CLASS,T1,T2) \
242 // bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor()); \
243 // bool bbDummyAdaptor##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterAdaptor(CLASS<T1,T2>::bbDescriptor());
244 //====================================================================