base/PlugFunction.hpp

Go to the documentation of this file.
00001 /*
00002   This file is part of OpenFLUID software
00003   Copyright (c) 2007-2010 INRA-Montpellier SupAgro
00004 
00005 
00006  == GNU General Public License Usage ==
00007 
00008   OpenFLUID is free software: you can redistribute it and/or modify
00009   it under the terms of the GNU General Public License as published by
00010   the Free Software Foundation, either version 3 of the License, or
00011   (at your option) any later version.
00012 
00013   OpenFLUID is distributed in the hope that it will be useful,
00014   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016   GNU General Public License for more details.
00017 
00018   You should have received a copy of the GNU General Public License
00019   along with OpenFLUID.  If not, see <http://www.gnu.org/licenses/>.
00020 
00021   In addition, as a special exception, INRA gives You the additional right
00022   to dynamically link the code of OpenFLUID with code not covered
00023   under the GNU General Public License ("Non-GPL Code") and to distribute
00024   linked combinations including the two, subject to the limitations in this
00025   paragraph. Non-GPL Code permitted under this exception must only link to
00026   the code of OpenFLUID dynamically through the OpenFLUID libraries
00027   interfaces, and only for building OpenFLUID plugins. The files of
00028   Non-GPL Code may be link to the OpenFLUID libraries without causing the
00029   resulting work to be covered by the GNU General Public License. You must
00030   obey the GNU General Public License in all respects for all of the
00031   OpenFLUID code and other code used in conjunction with OpenFLUID
00032   except the Non-GPL Code covered by this exception. If you modify
00033   this OpenFLUID, you may extend this exception to your version of the file,
00034   but you are not obligated to do so. If you do not wish to provide this
00035   exception without modification, you must delete this exception statement
00036   from your version and license this OpenFLUID solely under the GPL without
00037   exception.
00038 
00039 
00040  == Other Usage ==
00041 
00042   Other Usage means a use of OpenFLUID that is inconsistent with the GPL
00043   license, and requires a written agreement between You and INRA.
00044   Licensees for Other Usage of OpenFLUID may use this file in accordance
00045   with the terms contained in the written agreement between You and INRA.
00046 */
00047 
00048 
00071 #ifndef __PLUGFUNCTION_HPP__
00072 #define __PLUGFUNCTION_HPP__
00073 
00074 #include <string>
00075 
00076 #include <boost/filesystem/path.hpp>
00077 #include <glibmm.h>
00078 
00079 
00080 #include <openfluid/dllexport.hpp>
00081 #include <openfluid/core.hpp>
00082 #include <openfluid/base/SimStatus.hpp>
00083 #include <openfluid/base/ExecMsgs.hpp>
00084 #include <openfluid/base/EnvProperties.hpp>
00085 #include <openfluid/base/FuncSignature.hpp>
00086 #include <openfluid/base/StdoutFileOStream.hpp>
00087 
00088 
00089 
00090 
00091 // =====================================================================
00092 // =====================================================================
00093 
00097 #define PLUGFUNCTION_PROC_NAME "GetPlugFunction"
00098 
00102 #define PLUGSIGNATURE_PROC_NAME "GetPlugSignature"
00103 
00107 #define PLUGSDKVERSION_PROC_NAME "GetPlugSDKVersion"
00108 
00109 
00110 
00114 #define DECLARE_PLUGIN_HOOKS \
00115   extern "C" \
00116   { \
00117     DLLEXPORT std::string GetPlugSDKVersion(); \
00118     DLLEXPORT openfluid::base::PluggableFunction* GetPlugFunction(); \
00119     DLLEXPORT openfluid::base::FunctionSignature* GetPlugSignature(); \
00120   }
00121 
00122 
00123 
00124 
00125 // =====================================================================
00126 // =====================================================================
00127 
00128 
00133 #define DEFINE_FUNCTION_HOOK(pluginclassname) \
00134   std::string GetPlugSDKVersion() \
00135   { \
00136     return std::string(STRINGIFY(OPENFLUID_VERSION)); \
00137   } \
00138   \
00139   openfluid::base::PluggableFunction* GetPlugFunction() \
00140   { \
00141     return new pluginclassname(); \
00142   }
00143 
00144 
00145 
00146 // =====================================================================
00147 // =====================================================================
00148 
00153 #define DECLARE_UNITS_ORDERED_LOOP(loopid) \
00154   openfluid::core::UnitsList_t::iterator _M_##loopid##_ordit;\
00155   openfluid::core::UnitsList_t* _M_##loopid##_UList;
00156 
00157 
00162 #define DECLARE_GLOBAL_UNITS_ORDERED_LOOP(loopid) \
00163   openfluid::core::UnitsPtrList_t::iterator _M_##loopid##_ordit;\
00164   openfluid::core::UnitsPtrList_t* _M_##loopid##_GUList;
00165 
00166 
00173 #define BEGIN_UNITS_ORDERED_LOOP(loopid,unitclass,unit) \
00174   _M_##loopid##_UList = mp_CoreData->getUnits(unitclass)->getList(); \
00175   if (_M_##loopid##_UList != NULL) \
00176     { \
00177     for (_M_##loopid##_ordit = _M_##loopid##_UList->begin();_M_##loopid##_ordit != _M_##loopid##_UList->end();++_M_##loopid##_ordit) \
00178     { \
00179       unit = &(*_M_##loopid##_ordit);
00180 
00181 
00187 #define BEGIN_GLOBAL_UNITS_ORDERED_LOOP(loopid,unit) \
00188   { \
00189     _M_##loopid##_GUList = mp_CoreData->getUnitsGlobally(); \
00190     for (_M_##loopid##_ordit = _M_##loopid##_GUList->begin();_M_##loopid##_ordit != _M_##loopid##_GUList->end();++_M_##loopid##_ordit) \
00191     { \
00192       unit = (*_M_##loopid##_ordit);
00193 
00194 
00202 #define APPLY_UNITS_ORDERED_LOOP_THREADED(loopid,unitclass,funcptr,...) \
00203   _M_##loopid##_UList = mp_CoreData->getUnits(unitclass)->getList(); \
00204   if (_M_##loopid##_UList != NULL) \
00205   { \
00206     _M_##loopid##_ordit = _M_##loopid##_UList->begin(); \
00207     if (_M_##loopid##_ordit != _M_##loopid##_UList->end()) \
00208     { \
00209       openfluid::core::PcsOrd_t _M_##loopid##_pcsord = _M_##loopid##_ordit->getProcessOrder(); \
00210       while (_M_##loopid##_ordit != _M_##loopid##_UList->end()) \
00211       { \
00212         Glib::ThreadPool _M_##loopid##_pool(OPENFLUID_GetFunctionMaxThreads(),true); \
00213         while (_M_##loopid##_ordit != _M_##loopid##_UList->end() && _M_##loopid##_ordit->getProcessOrder() == _M_##loopid##_pcsord) \
00214         { \
00215           openfluid::core::Unit* _M_##loopid##_unit = &(*_M_##loopid##_ordit); \
00216           _M_##loopid##_pool.push(sigc::bind(sigc::mem_fun(*this,&funcptr),_M_##loopid##_unit, ## __VA_ARGS__)); \
00217           ++_M_##loopid##_ordit; \
00218         } \
00219         _M_##loopid##_pool.shutdown(); \
00220         if (_M_##loopid##_ordit != _M_##loopid##_UList->end()) _M_##loopid##_pcsord = _M_##loopid##_ordit->getProcessOrder(); \
00221       } \
00222     } \
00223   }
00224 
00225 
00232 #define APPLY_GLOBAL_UNITS_ORDERED_LOOP_THREADED(loopid,funcptr,...) \
00233   _M_##loopid##_GUList = mp_CoreData->getUnitsGlobally(); \
00234   if (_M_##loopid##_GUList != NULL) \
00235   { \
00236     _M_##loopid##_ordit = _M_##loopid##_GUList->begin(); \
00237     if (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) \
00238     { \
00239       openfluid::core::PcsOrd_t _M_##loopid##_pcsord = (*_M_##loopid##_ordit)->getProcessOrder(); \
00240       while (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) \
00241       { \
00242         Glib::ThreadPool _M_##loopid##_pool(OPENFLUID_GetFunctionMaxThreads(),true); \
00243         while (_M_##loopid##_ordit != _M_##loopid##_GUList->end() && (*_M_##loopid##_ordit)->getProcessOrder() == _M_##loopid##_pcsord) \
00244         { \
00245           openfluid::core::Unit* _M_##loopid##_unit = (*_M_##loopid##_ordit); \
00246           _M_##loopid##_pool.push(sigc::bind(sigc::mem_fun(*this,&funcptr),_M_##loopid##_unit, ## __VA_ARGS__)); \
00247           ++_M_##loopid##_ordit; \
00248         } \
00249         _M_##loopid##_pool.shutdown(); \
00250         if (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) _M_##loopid##_pcsord = (*_M_##loopid##_ordit)->getProcessOrder(); \
00251       } \
00252     } \
00253   }
00254 
00255 
00256 
00261 #define DECLARE_UNITS_LIST_LOOP(loopid) \
00262   openfluid::core::UnitsPtrList_t::iterator _M_##loopid##_lstit;\
00263 
00264 
00271 #define BEGIN_UNITS_LIST_LOOP(loopid,ulist,unit) \
00272   if ((ulist) != NULL) \
00273   { \
00274     for(_M_##loopid##_lstit=ulist->begin(); _M_##loopid##_lstit != ulist->end(); _M_##loopid##_lstit++) \
00275     { \
00276       unit = *_M_##loopid##_lstit; \
00277 
00278 
00282 #define DECLARE_EVENT_COLLECTION_LOOP \
00283   openfluid::core::EventsList_t::iterator _M_EvListiter;
00284 
00290 #define BEGIN_EVENT_COLLECTION_LOOP(evlist,evobj) \
00291   { \
00292     for(_M_EvListiter=(evlist)->begin(); _M_EvListiter != (evlist)->end(); _M_EvListiter++) \
00293     { \
00294       evobj = &(*_M_EvListiter);
00295 
00299 #define END_LOOP \
00300     } \
00301   }
00302 
00303 
00304 
00305 
00306 // =====================================================================
00307 // =====================================================================
00308 
00309 
00310 namespace openfluid { namespace base {
00311 
00312 
00313 
00323 class DLLEXPORT PluggableFunction
00324 {
00325 
00326   private:
00327 
00331     openfluid::core::CoreRepository* mp_InternalCoreData;
00332 
00333 
00337     openfluid::base::ExecutionMessages* mp_ExecMsgs;
00338 
00339 
00343     const openfluid::base::EnvironmentProperties* mp_FunctionEnv;
00344 
00345 
00349     openfluid::core::FuncParamsMap_t m_ParamsMap;
00350 
00354     openfluid::base::FuncID_t m_FunctionID;
00355 
00356     unsigned int m_MaxThreads;
00357 
00358     bool m_Initialized;
00359 
00360     static bool IsUnitIDInPtrList(const openfluid::core::UnitsPtrList_t* UnitsList,
00361                                   const openfluid::core::UnitID_t& ID);
00362 
00363     static std::string generateDotEdge(std::string SrcClass, std::string SrcID,
00364                                        std::string DestClass, std::string DestID,
00365                                        std::string Options);
00366 
00367 
00368   protected:
00369 
00370     // TODO check if const
00374     openfluid::core::CoreRepository* mp_CoreData;
00375 
00376 
00384     void OPENFLUID_GetVariable(openfluid::core::Unit *UnitPtr,
00385                                openfluid::core::VariableName_t VarName,
00386                                openfluid::core::TimeStep_t Step,
00387                                openfluid::core::ScalarValue *Value);
00388 
00396     void OPENFLUID_GetVariable(openfluid::core::Unit *UnitPtr,
00397                                openfluid::core::VariableName_t VarName,
00398                                openfluid::core::TimeStep_t Step,
00399                                openfluid::core::VectorValue *Value);
00400 
00407     void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00408                                 openfluid::core::InputDataName_t InputName,
00409                                 double *Value);
00410 
00417     void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00418                                 openfluid::core::InputDataName_t InputName,
00419                                 long *Value);
00420 
00427     void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00428                                 openfluid::core::InputDataName_t InputName,
00429                                 std::string *Value);
00430 
00437     void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00438                                 const openfluid::core::InputDataName_t& InputName,
00439                                 const double& Value);
00440 
00447     void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00448                                 const openfluid::core::InputDataName_t& InputName,
00449                                 const long& Value);
00450 
00457     void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00458                                 const openfluid::core::InputDataName_t& InputName,
00459                                 const std::string& Value);
00460 
00461 
00467     bool OPENFLUID_IsInputDataExist(openfluid::core::Unit *UnitPtr,
00468                                     openfluid::core::InputDataName_t InputName);
00469 
00470 
00471 
00477     bool OPENFLUID_IsVariableExist(openfluid::core::Unit *UnitPtr,
00478                                     openfluid::core::VariableName_t VarName);
00479 
00485     bool OPENFLUID_IsScalarVariableExist(openfluid::core::Unit *UnitPtr,
00486                                           openfluid::core::VariableName_t VarName);
00487 
00493     bool OPENFLUID_IsVectorVariableExist(openfluid::core::Unit *UnitPtr,
00494                                           openfluid::core::VariableName_t VarName);
00495 
00496 
00503     bool OPENFLUID_IsVariableExist(openfluid::core::Unit *UnitPtr,
00504                                     openfluid::core::VariableName_t VarName,
00505                                     openfluid::core::TimeStep_t Step);
00506 
00513     bool OPENFLUID_IsScalarVariableExist(openfluid::core::Unit *UnitPtr,
00514                                           openfluid::core::VariableName_t VarName,
00515                                           openfluid::core::TimeStep_t Step);
00516 
00523     bool OPENFLUID_IsVectorVariableExist(openfluid::core::Unit *UnitPtr,
00524                                           openfluid::core::VariableName_t VarName,
00525                                           openfluid::core::TimeStep_t Step);
00526 
00533     void OPENFLUID_AppendVariable(openfluid::core::Unit *UnitPtr,
00534                                   openfluid::core::VariableName_t VarName,
00535                                   openfluid::core::ScalarValue Value);
00536 
00543     void OPENFLUID_AppendVariable(openfluid::core::Unit *UnitPtr,
00544                                   openfluid::core::VariableName_t VarName,
00545                                   openfluid::core::VectorValue& Value);
00546 
00554     void OPENFLUID_SetVariable(openfluid::core::Unit *UnitPtr,
00555                                openfluid::core::VariableName_t VarName,
00556                                openfluid::core::TimeStep_t Step,
00557                                openfluid::core::ScalarValue Value);
00558 
00566     void OPENFLUID_SetVariable(openfluid::core::Unit *UnitPtr,
00567                                openfluid::core::VariableName_t VarName,
00568                                openfluid::core::TimeStep_t Step,
00569                                openfluid::core::VectorValue Value);
00570 
00577     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00578                                         openfluid::core::FuncParamKey_t ParamName,
00579                                         double *Value);
00580 
00587     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00588                                         openfluid::core::FuncParamKey_t ParamName,
00589                                         long *Value);
00590 
00597     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00598                                         openfluid::core::FuncParamKey_t ParamName,
00599                                         float *Value);
00600 
00607     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00608                                         openfluid::core::FuncParamKey_t ParamName,
00609                                         int *Value);
00610 
00617     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00618                                         openfluid::core::FuncParamKey_t ParamName,
00619                                         std::string *Value);
00620 
00627     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00628                                         openfluid::core::FuncParamKey_t ParamName,
00629                                         std::vector<std::string> *Values);
00630 
00631 
00638     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00639                                         openfluid::core::FuncParamKey_t ParamName,
00640                                         std::vector<double> *Values);
00641 
00642 
00649     bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00650                                         openfluid::core::FuncParamKey_t ParamName,
00651                                         std::vector<long> *Values);
00652 
00653 
00661     void OPENFLUID_GetEvents(openfluid::core::Unit *UnitPtr,
00662                              openfluid::core::DateTime BeginDate,
00663                              openfluid::core::DateTime EndDate,
00664                              openfluid::core::EventsCollection* Events);
00665 
00666 
00672     void OPENFLUID_AppendEvent(openfluid::core::Unit *UnitPtr,
00673                                openfluid::core::Event& Ev);
00674 
00675 
00676 
00681     bool OPENFLUID_IsUnitClassExist(openfluid::core::UnitClass_t ClassName);
00682 
00683 
00689     bool OPENFLUID_IsUnitExist(openfluid::core::UnitClass_t ClassName,
00690                                openfluid::core::UnitID_t ID);
00691 
00696     void OPENFLUID_GetUnitsCount(unsigned int& UnitsCount);
00697 
00704     bool OPENFLUID_GetUnitsCount(const openfluid::core::UnitClass_t ClassName,
00705                                  unsigned int& UnitsCount);
00706 
00707 
00715     bool OPENFLUID_GetUnit(const openfluid::core::UnitClass_t& ClassName,
00716                            const openfluid::core::UnitID_t& ID,
00717                            openfluid::core::Unit* aUnit);
00718 
00719     openfluid::core::Unit* OPENFLUID_GetUnit(const openfluid::core::UnitClass_t& ClassName,
00720                                              const openfluid::core::UnitID_t& ID);
00721 
00727     void OPENFLUID_AddUnit(openfluid::core::UnitClass_t ClassName,
00728                            openfluid::core::UnitID_t ID,
00729                            openfluid::core::PcsOrd_t PcsOrder);
00730 
00737     void OPENFLUID_DeleteUnit(openfluid::core::UnitClass_t ClassName,
00738                               openfluid::core::UnitID_t ID);
00739 
00740 
00749     bool OPENFLUID_AddFromToConnection(openfluid::core::UnitClass_t ClassNameFrom,
00750                                        openfluid::core::UnitID_t IDFrom,
00751                                        openfluid::core::UnitClass_t ClassNameTo,
00752                                        openfluid::core::UnitID_t IDTo);
00753 
00760     bool OPENFLUID_AddFromToConnection(openfluid::core::Unit* FromUnit,
00761                                        openfluid::core::Unit* ToUnit);
00762 
00771     bool OPENFLUID_RemoveFromToConnection(openfluid::core::UnitClass_t ClassNameFrom,
00772                                           openfluid::core::UnitID_t IDFrom,
00773                                           openfluid::core::UnitClass_t ClassNameTo,
00774                                           openfluid::core::UnitID_t IDTo);
00775 
00782     bool OPENFLUID_RemoveFromToConnection(openfluid::core::Unit* FromUnit,
00783                                           openfluid::core::Unit* ToUnit);
00784 
00785 
00794     bool OPENFLUID_AddChildParentConnection(openfluid::core::UnitClass_t ClassNameChild,
00795                                             openfluid::core::UnitID_t IDChild,
00796                                             openfluid::core::UnitClass_t ClassNameParent,
00797                                             openfluid::core::UnitID_t IDParent);
00798 
00805     bool OPENFLUID_AddChildParentConnection(openfluid::core::Unit* ChildUnit,
00806                                             openfluid::core::Unit* ParentUnit);
00807 
00808 
00817     bool OPENFLUID_RemoveChildParentConnection(openfluid::core::UnitClass_t ClassNameChild,
00818                                                 openfluid::core::UnitID_t IDChild,
00819                                                 openfluid::core::UnitClass_t ClassNameParent,
00820                                                 openfluid::core::UnitID_t IDParent);
00821 
00828     bool OPENFLUID_RemoveChildParentConnection(openfluid::core::Unit* ChildUnit,
00829                                                 openfluid::core::Unit* ParentUnit);
00830 
00838     bool OPENFLUID_IsUnitConnectedTo(openfluid::core::Unit* aUnit,
00839                                      const openfluid::core::UnitClass_t& ClassNameTo,
00840                                      const openfluid::core::UnitID_t& IDTo);
00841 
00842 
00850     bool OPENFLUID_IsUnitConnectedFrom(openfluid::core::Unit* aUnit,
00851                                        const openfluid::core::UnitClass_t& ClassNameFrom,
00852                                        const openfluid::core::UnitID_t& IDFrom);
00853 
00854 
00862     bool OPENFLUID_IsUnitChildOf(openfluid::core::Unit* aUnit,
00863                                  const openfluid::core::UnitClass_t& ClassNameParent,
00864                                  const openfluid::core::UnitID_t& IDParent);
00865 
00866 
00874     bool OPENFLUID_IsUnitParentOf(openfluid::core::Unit* aUnit,
00875                                   const openfluid::core::UnitClass_t& ClassNameChild,
00876                                   const openfluid::core::UnitID_t& IDChild);
00877 
00878 
00885     void OPENFLUID_BuildUnitsMatrix(const openfluid::core::UnitClass_t& UnitsClass,
00886                                     const unsigned int& ColsNbr,
00887                                     const unsigned int& RowsNbr);
00888 
00889 
00895     void OPENFLUID_ExportUnitsGraphAsDotFile(const std::string& Filename);
00896 
00903     void OPENFLUID_RaiseWarning(std::string Sender, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00904 
00910     void OPENFLUID_RaiseWarning(std::string Sender, std::string Msg);
00911 
00919     void OPENFLUID_RaiseWarning(std::string Sender, std::string Source, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00920 
00927     void OPENFLUID_RaiseWarning(std::string Sender, std::string Source, std::string Msg);
00928 
00929 
00936     void OPENFLUID_RaiseError(std::string Sender, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00937 
00943     void OPENFLUID_RaiseError(std::string Sender, std::string Msg);
00944 
00952     void OPENFLUID_RaiseError(std::string Sender, std::string Source, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00953 
00960     void OPENFLUID_RaiseError(std::string Sender, std::string Source, std::string Msg);
00961 
00962 
00968     bool OPENFLUID_GetRunEnvironment(std::string Key, std::string *Value);
00969 
00975     bool OPENFLUID_GetRunEnvironment(std::string Key, bool *Value);
00976 
00981     inline unsigned int OPENFLUID_GetFunctionMaxThreads() const { return m_MaxThreads; };
00982 
00987     void OPENFLUID_SetFunctionMaxThreads(const unsigned int& MaxNumThreads);
00988 
00989 
00990     StdoutAndFileOutputStream OPENFLUID_Logger;
00991 
00992 
00993   public:
00997     PluggableFunction();
00998 
01002     virtual ~PluggableFunction();
01003 
01004 
01005     void initializeFunction(openfluid::core::CoreRepository* CoreData,
01006                             openfluid::base::ExecutionMessages* ExecMsgs,
01007                             openfluid::base::EnvironmentProperties* FuncEnv,
01008                             const unsigned int& MaxThreads,
01009                             const openfluid::base::FuncID_t& FuncID);
01010 
01011 
01012 
01013 
01017     virtual bool initParams(openfluid::core::FuncParamsMap_t Params)=0;
01018 
01022     virtual bool prepareData()=0;
01023 
01027     virtual bool checkConsistency()=0;
01028 
01029 
01033     virtual bool initializeRun(const SimulationInfo* SimInfo)=0;
01034 
01038     virtual bool runStep(const SimulationStatus* SimStatus)=0;
01039 
01043     virtual bool finalizeRun(const SimulationInfo* SimInfo)=0;
01044 
01045 };
01046 
01047 
01048 typedef PluggableFunction* (*GetPluggableFunctionProc)();
01049 
01050 typedef FunctionSignature* (*GetSignatureProc)();
01051 
01052 typedef std::string (*GetSDKVersionProc)();
01053 
01054 
01055 
01056 } } // namespace openfluid::base
01057 
01058 
01059 
01060 #endif
01061 

Generated using Doxygen 1.7.3
Creative Commons License Creative Commons By-NC-ND license