1 /*=========================================================================
4 Module: $RCSfile: bbtkPackage.h,v $
6 Date: $Date: 2008/04/08 06:59:30 $
7 Version: $Revision: 1.6 $
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 category of the package
51 const std::string& GetCategory() const { return mCategory; }
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(const DataInfo& typein,
69 const DataInfo& typeout,
70 const std::string& name) const;
72 BlackBox* NewWidgetAdaptor(const DataInfo& typein,
73 const DataInfo& typeout,
74 const std::string& name) const;
75 bool FindAdaptor(const DataInfo& typein,
76 const DataInfo& typeout,
77 std::string& adaptor) const;
78 bool FindWidgetAdaptor(const DataInfo& typein,
79 const DataInfo& typeout,
80 std::string& adaptor) const;
82 bool RegisterBlackBox(BlackBoxDescriptor*);
83 void UnRegisterBlackBox(const std::string& name);
85 // bool RegisterAdaptor(BlackBoxDescriptor*);
87 void PrintBlackBoxes(bool description = false,
88 bool adaptors = false) const;
89 void PrintAdaptors(bool description = false) const;
90 void HelpBlackBox(const std::string& name, bool full=true) const;
92 void CreateHtmlPage(const std::string& filename,
93 const std::string& caller = "?",
94 const std::string& source = "?",
95 const std::string& custom_header = "",
96 const std::string& custom_title = "",
99 bool relative_link = false ) const;
101 void SetDocURL(std::string url){ mDocURL=url; }
102 const std::string& GetDocURL() const { return mDocURL; }
104 void SetDocRelativeURL(std::string url){ mDocRelativeURL=url; }
105 const std::string& GetDocRelativeURL() const { return mDocRelativeURL; }
108 unsigned int GetNumberOfBlackBoxes() const { return mBlackBoxMap.size(); }
110 /// Changes the name of a black box type
111 void ChangeBlackBoxName( const std::string& oldname,
112 const std::string& newname );
113 /// The type of map of descriptors
114 typedef std::map< std::string, BlackBoxDescriptor*> BlackBoxMapType;
115 const BlackBoxMapType& GetBlackBoxMap() const { return mBlackBoxMap; }
116 BlackBoxMapType& GetBlackBoxMap() { return mBlackBoxMap; }
118 // Factories management
119 /// Adds the factory to the set of factories which use the package
120 void AddFactory(Factory* f) { mFactorySet.insert(f); }
121 /// Removes the factory from the set of factories which use the package
122 void RemoveFactory(Factory* f) { mFactorySet.erase(f); }
124 /// Gets the set of factories which use the package
125 std::set<Factory*>& GetFactorySet() { return mFactorySet; }
126 /// Gets the set of factories which use the package (const)
127 const std::set<Factory*>& GetFactorySet() const { return mFactorySet; }
131 /// The name of the package
133 /// The author of the package
135 /// The categories of the package
136 std::string mCategory;
137 /// The description of the package
138 std::string mDescription;
139 /// The version of the package
140 std::string mVersion;
141 /// The version of the library bbtk used to build the package
142 std::string mBBTKVersion;
143 /// URL of the documentation of the Package (absolute path)
145 /// URL of the documentation of the Package
146 /// (path relative to bbtk doc root)
147 std::string mDocRelativeURL;
150 /// The map of black boxes descriptors
151 BlackBoxMapType mBlackBoxMap;
153 /// The type of key in the map of adaptor descriptors
157 AdaptorKey( const DataInfo& typein, const DataInfo& typeout,
158 BlackBoxDescriptor::Kind kind )
159 : mTypeIn(typein), mTypeOut(typeout), mKind(kind) {}
161 bool operator< ( const AdaptorKey& k ) const
163 return ( ( mKind < k.mKind ) ||
164 ( ( mKind == k.mKind ) &&
165 ( ( mTypeIn < k.mTypeIn ) ||
166 ( ( mTypeIn == k.mTypeIn ) &&
167 ( mTypeOut < k.mTypeOut ) ) ) ) );
173 BlackBoxDescriptor::Kind mKind;
176 /// The type of map of adaptor descriptors
177 typedef std::map< AdaptorKey, BlackBoxDescriptor*> AdaptorMapType;
179 /// The map of adaptors descriptors
180 AdaptorMapType mAdaptorMap;
183 /// The set of factories which contain the package
184 std::set<Factory*> mFactorySet;
188 //====================================================================
191 //====================================================================
193 #define BBTK_PACKAGE_EXPORT __declspec( dllexport )
195 #define BBTK_PACKAGE_EXPORT
196 #endif // defined(_WIN32)
197 //====================================================================
199 //====================================================================
200 #define BBTK_DECLARE_PACKAGE(NAME) \
203 bbtk::Package*& NAME ## GetPackagePointer(); \
204 BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage(); \
205 BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage(); \
207 //====================================================================
209 //====================================================================
210 #define BBTK_IMPLEMENT_PACKAGE(NAME,AUTHOR,DESCRIPTION,VERSION) \
213 bbtk::Package*& NAME ## GetPackagePointer() \
215 static bbtk::Package* u = 0; \
218 BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage() \
220 if (NAME ## GetPackagePointer()) \
221 delete NAME ## GetPackagePointer(); \
222 NAME ## GetPackagePointer() = 0; \
224 BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage() \
226 if (!NAME ## GetPackagePointer()) \
227 NAME ## GetPackagePointer() = \
228 new bbtk::Package(#NAME, \
232 BBTK_STRINGIFY_SYMBOL(BBTK_VERSION) \
234 return NAME ## GetPackagePointer(); \
237 //====================================================================
239 //====================================================================
240 #define BBTK_ADD_BLACK_BOX_TO_PACKAGE(NAME,CLASS) \
241 bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor());
242 //====================================================================
244 //====================================================================
245 #define BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
246 bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor());
247 //====================================================================
249 //====================================================================
250 #define BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(NAME,CLASS,T1,T2) \
251 bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor());
252 //====================================================================
254 //====================================================================
255 //#define BBTK_ADD_ADAPTOR_TO_PACKAGE(NAME,CLASS) \
256 // bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor()); \
257 // bool bbDummyAdaptor##NAME##CLASS = NAME ## GetPackage()->RegisterAdaptor(CLASS::bbDescriptor());
258 //====================================================================
260 //====================================================================
261 //#define BBTK_ADD_TEMPLATE_ADAPTOR_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
262 // bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor()); \
263 // bool bbDummyAdaptor##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterAdaptor(CLASS<TEMPLATE_PARAM>::bbDescriptor());
264 //====================================================================
266 //====================================================================
267 //#define BBTK_ADD_TEMPLATE2_ADAPTOR_TO_PACKAGE(NAME,CLASS,T1,T2) \
268 // bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor()); \
269 // bool bbDummyAdaptor##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterAdaptor(CLASS<T1,T2>::bbDescriptor());
270 //====================================================================