]> Creatis software - bbtk.git/blob - kernel/src/bbtkFactory.h
*** empty log message ***
[bbtk.git] / kernel / src / bbtkFactory.h
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkFactory.h,v $
5   Language:  C++
6   Date:      $Date: 2008/03/03 14:55:55 $
7   Version:   $Revision: 1.9 $
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::Factory : can load and unload dynamic libraries containing black boxes packages and create instances of the black boxes registered in the packages loaded.
21  */
22 /**
23  *\class bbtk::Factory
24  *\brief Can load and unload dynamic libraries containing black boxes packages and create instances of the black boxes registered in the packages loaded.
25  *
26  */
27
28
29 #ifndef __bbtkFactory_h__
30 #define __bbtkFactory_h__
31
32 //#include "bbtkBlackBox.h"
33 #include "bbtkPackage.h"
34 #include "bbtkDynamicLibraryHandling.h"
35
36 namespace bbtk
37 {
38   class BBTK_EXPORT Factory
39   {
40
41   public:
42
43     Factory();
44     ~Factory();
45
46     void LoadPackage( const std::string& name );
47     void UnLoadPackage( const std::string& name );
48     void PrintPackages(bool details = true, bool adaptors = false) const;
49     void HelpPackage(const std::string& name, bool adaptors = false) const;
50     void HelpBlackBox(const std::string& name, std::string& package,
51                       bool full=true ) const;
52     void ShowGraphTypes(const std::string& name) const;
53     void InsertPackage( Package* );
54     void RemovePackage( Package* );
55
56     const Package* GetPackage(const std::string& name) const;
57     Package* GetPackage(const std::string& name);
58     
59     BlackBox* NewBlackBox(const std::string& type, 
60                           const std::string& name) const;
61     
62     BlackBox* NewAdaptor(TypeInfo typein,
63                          TypeInfo typeout,
64                          const std::string& name) const;
65     
66     Connection* NewConnection(BlackBox* from,
67                               const std::string& output,
68                               BlackBox* to,
69                               const std::string& input) const;
70
71     void WriteDotFilePackagesList(FILE *ff);
72
73     void Reset();
74     
75     typedef enum
76       {
77         Packages,
78         Categories,
79         Initials,
80         Adaptors
81       }
82       IndexEntryType;
83     void CreateHtmlIndex(IndexEntryType type, const std::string& filename);
84
85   private:
86
87     bool DoLoadPackage(std::string libname,
88                        std::string pkgname,
89                        std::string path);
90
91     /// The structure storing info on a package
92     class PackageInfoType
93     {
94     public :
95       /// Ctor
96       PackageInfoType() {}
97       /// Dtor
98       ~PackageInfoType() {}
99       /// The pointer on the package
100       Package* mPackage;
101       /// The handler of the dynamic library 
102       DynamicLibraryHandler mDynamicLibraryHandler;
103     };
104     /// The type of map of packages
105     typedef std::map< std::string, PackageInfoType > PackageMapType;
106     /// The map of packages
107     PackageMapType mPackageMap;
108
109     void CloseAllPackages();
110     void ClosePackage(PackageMapType::iterator& i);
111
112   };
113   // class Factory
114
115
116   /// SYSTEM METHOD : Global method returning the global factory object pointer
117   inline Factory*& GlobalFactoryPointer() 
118   {
119     static Factory* f = 0;
120     return f;
121   }
122
123   /// SYSTEM METHOD : Global method returning the global factory object 
124   inline Factory* GetGlobalFactory() 
125   {
126     if (!GlobalFactoryPointer()) 
127     {
128        GlobalFactoryPointer() = new Factory;
129     }
130     return GlobalFactoryPointer();
131   }
132
133   /// SYSTEM METHOD : Deletes the global factory pointer
134   inline void DeleteGlobalFactory() 
135   {
136     if (GlobalFactoryPointer()) 
137     {
138       delete GlobalFactoryPointer();
139     }
140   }
141
142   inline void LoadPackage( const std::string& name )
143   {
144     GetGlobalFactory()->LoadPackage(name);
145   }
146
147   inline void UnLoadPackage( const std::string& name )
148   { 
149     GetGlobalFactory()->UnLoadPackage(name);
150   }
151
152   inline void PrintPackages(bool details = true, bool adaptors = false)
153   {
154     GetGlobalFactory()->PrintPackages(details,adaptors);
155   }
156
157   inline void HelpPackage(const std::string& name, bool adaptors = false) 
158   {
159     GetGlobalFactory()->HelpPackage(name,adaptors);
160   }
161   
162   inline void HelpBlackBox(const std::string& name, bool full=true) 
163   {
164     std::string package; 
165     GetGlobalFactory()->HelpBlackBox(name, package, full);
166   }
167
168   inline void HelpBlackBox(const std::string& name, std::string& package,
169                            bool full=true
170                            )
171   {
172     GetGlobalFactory()->HelpBlackBox(name, package, full);
173   }
174
175
176   inline void ShowGraphTypes(const std::string& name)
177   {
178     GetGlobalFactory()->ShowGraphTypes(name);
179   }
180
181   inline void InsertPackage( Package* p)
182   {
183     GetGlobalFactory()->InsertPackage(p);
184   }
185
186   inline void RemovePackage( Package* p)
187   {
188     GetGlobalFactory()->RemovePackage(p);
189   }
190   
191   inline const Package* GetPackage(const std::string& name) 
192   {
193     return GetGlobalFactory()->GetPackage(name);
194   }
195     
196   inline BlackBox* NewBlackBox(const std::string& type, 
197                                const std::string& name) 
198   {
199     return GetGlobalFactory()->NewBlackBox(type,name);
200   }
201     
202   inline BlackBox* NewAdaptor(TypeInfo typein,
203                               TypeInfo typeout,
204                               const std::string& name) 
205   {
206     return GetGlobalFactory()->NewAdaptor(typein,typeout,name);
207   }
208   
209   inline Connection* NewConnection(BlackBox* from,
210                                    const std::string& output,
211                                    BlackBox* to,
212                                    const std::string& input) 
213   {
214     return GetGlobalFactory()->NewConnection(from,output,to,input);
215   }
216   
217   inline void WriteDotFilePackagesList(FILE *ff)
218   {
219     GetGlobalFactory()->WriteDotFilePackagesList(ff);
220   }
221
222 }// namespace bbtk
223
224
225
226 #endif
227