kernel modules Wiedervereinigung
[scilab.git] / scilab / modules / ast / includes / types / function.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
4  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #ifndef __FUNCTION_HXX__
15 #define __FUNCTION_HXX__
16
17
18 #ifdef _MSC_VER
19 #pragma warning(disable: 4251)
20 #endif
21
22 #include <string>
23 #include "types.hxx"
24 #include "callable.hxx"
25
26 extern "C"
27 {
28 #include "c_gateway_prototype.h"
29 #include "dynamiclibrary.h"
30 }
31
32 #define MAX_OUTPUT_VARIABLE             64
33
34 namespace types
35 {
36 class EXTERN_AST Function : public Callable
37 {
38 public :
39     enum FunctionType
40     {
41         EntryPointC         = 0,
42         EntryPointCPP       = 1,
43         EntryPointMex       = 2,
44         EntryPointCPPOpt    = 3,
45     };
46
47     typedef void (*LOAD_DEPS)(std::wstring);
48     typedef int (*INIT_MODULE)(void);
49     typedef ReturnValue (*GW_FUNC)(typed_list &in, int _iRetCount, typed_list &out);
50     typedef ReturnValue (*GW_FUNC_OPT)(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out);
51
52     Function() : Callable() {};
53     Function(std::wstring _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
54     ~Function();
55
56     //FIXME : Should not return NULL
57     InternalType*           clone();
58
59     static Function*        createFunction(std::wstring _wstName, GW_FUNC _pFunc, std::wstring _wstModule);
60     static Function*        createFunction(std::wstring _wstName, GW_FUNC_OPT _pFunc, std::wstring _wstModule);
61     static Function*        createFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, std::wstring _wstModule);
62     static Function*        createFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, std::wstring _wstModule);
63     static Function*        createFunction(std::wstring _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
64     static Function*        createFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
65     static Function*        createFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
66
67     /*dynamic gateways*/
68     static Function*        createFunction(std::wstring _wstFunctionName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
69     static Function*        createFunction(std::wstring _wstFunctionName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, std::wstring _wstLoadDepsName, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
70
71     inline ScilabType       getType(void)
72     {
73         return ScilabFunction;
74     }
75     inline ScilabId         getId(void)
76     {
77         return IdFunction;
78     }
79
80     bool                    isFunction()
81     {
82         return true;
83     }
84
85     void                    whoAmI();
86
87     bool                    toString(std::wostringstream& ostr);
88
89     virtual ReturnValue     call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
90
91     /* return type as string ( double, int, cell, list, ... )*/
92     virtual std::wstring    getTypeStr()
93     {
94         return L"fptr";
95     }
96     /* return type as short string ( s, i, ce, l, ... )*/
97     virtual std::wstring    getShortTypeStr()
98     {
99         return L"fptr";
100     }
101
102     GW_FUNC                 getFunc()
103     {
104         return m_pFunc;
105     }
106     LOAD_DEPS               getDeps()
107     {
108         return m_pLoadDeps;
109     }
110
111 protected:
112     LOAD_DEPS               m_pLoadDeps;
113
114 private :
115     GW_FUNC                 m_pFunc;
116 };
117
118 class OptFunction : public Function
119 {
120 private :
121     OptFunction(OptFunction* _Function);
122 public :
123     OptFunction(std::wstring _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
124
125     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
126     InternalType*           clone();
127
128     GW_FUNC_OPT             getFunc()
129     {
130         return m_pFunc;
131     }
132
133 private :
134     GW_FUNC_OPT             m_pFunc;
135 };
136
137
138 class WrapFunction : public Function
139 {
140 private :
141     WrapFunction(WrapFunction* _pWrapFunction);
142 public :
143     WrapFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
144
145     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
146     InternalType*           clone();
147
148     OLDGW_FUNC              getFunc()
149     {
150         return m_pOldFunc;
151     }
152
153 private :
154     OLDGW_FUNC              m_pOldFunc;
155 };
156
157 class WrapMexFunction : public Function
158 {
159 private :
160     WrapMexFunction(WrapMexFunction* _pWrapFunction);
161 public :
162     WrapMexFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
163
164     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
165     InternalType*           clone();
166
167     MEXGW_FUNC              getFunc()
168     {
169         return m_pOldFunc;
170     }
171
172 private :
173     MEXGW_FUNC              m_pOldFunc;
174 };
175
176 class DynamicFunction : public Function
177 {
178 private :
179     DynamicFunction(DynamicFunction* _pDynamicFunction);
180 public :
181     DynamicFunction(std::wstring _wstName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
182
183     virtual ~DynamicFunction();
184
185     DynamicFunction(std::wstring _wstName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, std::wstring _wstLoadDepsName, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
186     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
187 private :
188     Callable::ReturnValue   Init();
189     void                    Clear();
190
191     std::wstring            m_wstLibName;
192     std::wstring            m_wstEntryPoint;
193     std::wstring            m_wstLoadDepsName;
194     bool                    m_bCloseLibAfterCall;
195     FunctionType            m_iType;
196     GW_FUNC                 m_pFunc;
197     GW_FUNC_OPT             m_pOptFunc;
198     OLDGW_FUNC              m_pOldFunc;
199     MEXGW_FUNC              m_pMexFunc;
200     Function*               m_pFunction;
201 };
202
203 }
204
205
206 #endif /* !__FUNCTION_HXX__ */