]> Creatis software - bbtk.git/blob - kernel/src/bbtkPackage.h
Global factory in course of removal... does not compile but have to commit to continu...
[bbtk.git] / kernel / src / bbtkPackage.h
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkPackage.h,v $
5   Language:  C++
6   Date:      $Date: 2008/03/07 08:40:14 $
7   Version:   $Revision: 1.5 $
8                                                                                 
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.
12                                                                                 
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.
16                                                                                 
17 =========================================================================*/
18 /**
19  * \file
20  * \brief Class bbtk::Package : registers black boxes descriptors and is able to create instances of the black boxes registered.
21  */
22 /**
23  * \class bbtk::Package
24  * \brief registers black boxes descriptors and is able to create instances of the black boxes registered.
25  */
26
27 #ifndef __bbtkPackage_h__
28 #define __bbtkPackage_h__
29
30 #include "bbtkBlackBox.h"
31
32 namespace bbtk
33 {
34
35   class BBTK_EXPORT Package
36   {
37   public:
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);
43     ~Package();
44     /// Returns the name of the package
45     const std::string& GetName() const { return mName; }
46
47     /// Returns the author of the package
48     const std::string& GetAuthor() const { return mAuthor; }
49
50     /// Returns the category of the package
51     const std::string& GetCategory() const { return mCategory; }
52
53     /// Returns the description of the package
54     const std::string& GetDescription() const { return mDescription; }
55
56     /// Returns the version of the package
57     const std::string& GetVersion() const { return mVersion; }
58
59     /// Returns the version of bbtk used to build the package
60     const std::string& GetBBTKVersion() const { return mBBTKVersion; }
61
62     bool ContainsBlackBox(const std::string& boxname) const;
63
64  
65     BlackBox* NewBlackBox(const std::string& type,
66                              const std::string& name) const;
67   
68     BlackBox* NewAdaptor(TypeInfo typein,
69                             TypeInfo typeout,
70                             const std::string& name) const;
71
72     bool RegisterBlackBox(BlackBoxDescriptor*); 
73     void UnRegisterBlackBox(const std::string& name); 
74
75     //   bool RegisterAdaptor(BlackBoxDescriptor*); 
76
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;
81     
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 = "",
87                         int detail = 1, 
88                         int level = 0,
89                         bool relative_link = false ) const;
90
91     void  SetDocURL(std::string url){ mDocURL=url; }
92     const std::string& GetDocURL() const { return mDocURL; }
93     
94     void  SetDocRelativeURL(std::string url){ mDocRelativeURL=url; }
95     const std::string& GetDocRelativeURL() const { return mDocRelativeURL; }
96
97
98     unsigned int GetNumberOfBlackBoxes() const { return mBlackBoxMap.size(); }
99     
100     /// Changes the name of a black box type
101     void ChangeBlackBoxName( const std::string& oldname, 
102                              const std::string& newname );
103     /// The type of map of descriptors
104     typedef std::map< std::string, BlackBoxDescriptor*> BlackBoxMapType;
105     const BlackBoxMapType& GetBlackBoxMap() const { return mBlackBoxMap; }
106     BlackBoxMapType& GetBlackBoxMap() { return mBlackBoxMap; }
107
108     // Factories management
109     /// Adds the factory to the set of factories which use the package
110     void AddFactory(Factory* f) { mFactorySet.insert(f); }
111     /// Removes the factory from the set of factories which use the package
112     void RemoveFactory(Factory* f) { mFactorySet.erase(f); }
113
114     /// Gets the set of factories which use the package
115     std::set<Factory*>& GetFactorySet() { return mFactorySet; }
116     /// Gets the set of factories which use the package (const)
117     const std::set<Factory*>& GetFactorySet() const { return mFactorySet; }
118     
119   private:
120
121     /// The name of the package
122     std::string mName;
123     /// The author of the package
124     std::string mAuthor;
125     /// The categories of the package
126     std::string mCategory;    
127     /// The description of the package
128     std::string mDescription;
129     /// The version of the package
130     std::string mVersion;
131     /// The version of the library bbtk used to build the package
132     std::string mBBTKVersion;
133     /// URL of the documentation of the Package (absolute path)
134     std::string mDocURL;
135     /// URL of the documentation of the Package 
136     /// (path relative to bbtk doc root)
137     std::string mDocRelativeURL;
138
139
140     /// The map of black boxes descriptors
141     BlackBoxMapType mBlackBoxMap;
142
143     /// The type of key in the map of adaptor descriptors
144     class AdaptorKey 
145     {
146     public:
147       AdaptorKey( TypeInfo typein, TypeInfo typeout) 
148         : mTypeIn(typein.name()), mTypeOut(typeout.name()) {}
149       
150       bool operator< ( const AdaptorKey& k ) const
151       {
152         //      return ( ( mTypeIn.before(k.mTypeIn) ) ||
153         //               ( ( mTypeIn == k.mTypeIn ) && 
154         //                 ( mTypeOut.before(k.mTypeOut) ) ) );
155         return ( ( mTypeIn < k.mTypeIn ) ||
156                  ( ( mTypeIn == k.mTypeIn ) && 
157                    ( mTypeOut < k.mTypeOut ) ) );
158       }
159       
160     private:
161       //      TypeInfo mTypeIn;
162       //      TypeInfo mTypeOut;
163       std::string mTypeIn;
164       std::string mTypeOut;
165     };
166     
167     /// The type of map of adaptor descriptors
168     typedef std::map< AdaptorKey, BlackBoxDescriptor*> AdaptorMapType;
169
170     /// The map of adaptors descriptors
171     AdaptorMapType mAdaptorMap;
172
173
174     /// The set of factories which contain the package 
175     std::set<Factory*> mFactorySet;
176     
177   };
178   // EO class Package
179   //====================================================================
180
181
182 //====================================================================
183 #if defined(_WIN32)
184   #define BBTK_PACKAGE_EXPORT __declspec( dllexport )
185 #else
186   #define BBTK_PACKAGE_EXPORT
187 #endif // defined(_WIN32) 
188 //====================================================================
189
190 //====================================================================
191 #define BBTK_DECLARE_PACKAGE(NAME)                                      \
192   extern "C"                                                            \
193   {                                                                     \
194     bbtk::Package*& NAME ## GetPackagePointer();                        \
195     BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage();        \
196     BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage(); \
197   }
198 //==================================================================== 
199
200 //==================================================================== 
201 #define BBTK_IMPLEMENT_PACKAGE(NAME,AUTHOR,DESCRIPTION,VERSION)         \
202   extern "C"                                                            \
203   {                                                                     \
204     bbtk::Package*& NAME ## GetPackagePointer()                         \
205     {                                                                   \
206       static bbtk::Package* u = 0;                                      \
207       return u;                                                         \
208     }                                                                   \
209     BBTK_PACKAGE_EXPORT void BBTK_CDECL NAME ## DeletePackage()         \
210     {                                                                   \
211       if (NAME ## GetPackagePointer())                                  \
212         delete NAME ## GetPackagePointer();                             \
213       NAME ## GetPackagePointer() = 0;                                  \
214     }                                                                   \
215     BBTK_PACKAGE_EXPORT bbtk::Package* BBTK_CDECL NAME ## GetPackage()  \
216     {                                                                   \
217       if (!NAME ## GetPackagePointer())                                 \
218         NAME ## GetPackagePointer() =                                   \
219           new bbtk::Package(#NAME,                                      \
220                             AUTHOR,     \
221                             DESCRIPTION, \
222                             VERSION,    \
223                             BBTK_STRINGIFY_SYMBOL(BBTK_VERSION)         \
224                             );                                          \
225       return NAME ## GetPackagePointer();                               \
226     }                                                                   \
227   }
228 //====================================================================  
229
230 //====================================================================
231 #define BBTK_ADD_BLACK_BOX_TO_PACKAGE(NAME,CLASS)                       \
232   bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor());
233   //====================================================================
234   
235 //====================================================================
236 #define BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
237   bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor());
238   //====================================================================
239
240 //====================================================================
241 #define BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(NAME,CLASS,T1,T2)       \
242   bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor()); 
243   //====================================================================
244   
245 //====================================================================
246 //#define BBTK_ADD_ADAPTOR_TO_PACKAGE(NAME,CLASS)                       \
247 //  bool bbDummy##NAME##CLASS = NAME ## GetPackage()->RegisterBlackBox(CLASS::bbDescriptor()); \
248 //  bool bbDummyAdaptor##NAME##CLASS = NAME ## GetPackage()->RegisterAdaptor(CLASS::bbDescriptor());
249 //====================================================================
250
251 //====================================================================
252 //#define BBTK_ADD_TEMPLATE_ADAPTOR_TO_PACKAGE(NAME,CLASS,TEMPLATE_PARAM) \
253 //  bool bbDummy##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterBlackBox(CLASS<TEMPLATE_PARAM>::bbDescriptor()); \
254 //  bool bbDummyAdaptor##NAME##CLASS##TEMPLATE_PARAM = NAME ## GetPackage()->RegisterAdaptor(CLASS<TEMPLATE_PARAM>::bbDescriptor());
255 //====================================================================
256
257 //====================================================================
258 //#define BBTK_ADD_TEMPLATE2_ADAPTOR_TO_PACKAGE(NAME,CLASS,T1,T2)       \
259 //  bool bbDummy##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterBlackBox(CLASS<T1,T2>::bbDescriptor()); \
260 //    bool bbDummyAdaptor##NAME##CLASS##T1##T2 = NAME ## GetPackage()->RegisterAdaptor(CLASS<T1,T2>::bbDescriptor());
261   //====================================================================
262
263 }// namespace bbtk
264
265
266
267 #endif
268