Attack of the Clones
[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         EntryPointOldC = 0,
42         EntryPointCPP = 1,
43         EntryPointMex = 2,
44         EntryPointCPPOpt = 3,
45         EntryPointC = 4
46     };
47
48     typedef int(*LOAD_DEPS)(const std::wstring&);
49     typedef int (*INIT_MODULE)(void);
50     typedef ReturnValue (*GW_FUNC)(typed_list &in, int _iRetCount, typed_list &out);
51     typedef ReturnValue (*GW_FUNC_OPT)(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out);
52
53     Function() : Callable() {};
54     Function(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
55     ~Function();
56
57     //FIXME : Should not return NULL
58     virtual Function*       clone();
59
60     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, const std::wstring& _wstModule);
61     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, const std::wstring& _wstModule);
62     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, const std::wstring& _wstModule);
63     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, const std::wstring& _wstModule);
64     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
65     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
66     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
67     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
68     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, const std::wstring& _wstModule);
69     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
70
71     /*dynamic gateways*/
72     static Function*        createFunction(const std::wstring& _wstFunctionName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
73     static Function*        createFunction(const std::wstring& _wstFunctionName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, const std::wstring& _wstLoadDepsName, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
74
75     inline ScilabType       getType(void)
76     {
77         return ScilabFunction;
78     }
79     inline ScilabId         getId(void)
80     {
81         return IdFunction;
82     }
83
84     bool                    isFunction()
85     {
86         return true;
87     }
88
89     void                    whoAmI();
90
91     bool                    toString(std::wostringstream& ostr);
92
93     virtual ReturnValue     call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
94
95     /* return type as string ( double, int, cell, list, ... )*/
96     virtual std::wstring    getTypeStr()
97     {
98         return L"fptr";
99     }
100     /* return type as short string ( s, i, ce, l, ... )*/
101     virtual std::wstring    getShortTypeStr()
102     {
103         return L"fptr";
104     }
105
106     GW_FUNC                 getFunc()
107     {
108         return m_pFunc;
109     }
110     LOAD_DEPS               getDeps()
111     {
112         return m_pLoadDeps;
113     }
114
115 private :
116     GW_FUNC                 m_pFunc;
117
118 protected:
119     LOAD_DEPS               m_pLoadDeps;
120
121 };
122
123 class OptFunction : public Function
124 {
125 private :
126     OptFunction(OptFunction* _Function);
127 public :
128     OptFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
129
130     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
131     OptFunction*            clone();
132
133     GW_FUNC_OPT             getFunc()
134     {
135         return m_pFunc;
136     }
137
138 private:
139     GW_FUNC_OPT             m_pFunc;
140 };
141
142
143 class WrapFunction : public Function
144 {
145 private:
146     WrapFunction(WrapFunction* _pWrapFunction);
147 public:
148     WrapFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
149
150     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
151     WrapFunction*           clone();
152
153     OLDGW_FUNC              getFunc()
154     {
155         return m_pOldFunc;
156     }
157
158 private:
159     OLDGW_FUNC              m_pOldFunc;
160 };
161
162 class WrapCFunction : public Function
163 {
164 private:
165     WrapCFunction(WrapCFunction* _pWrapFunction);
166 public:
167     WrapCFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
168
169     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
170     WrapCFunction*          clone();
171
172     GW_C_FUNC               getFunc()
173     {
174         return m_pCFunc;
175     }
176
177 private:
178     GW_C_FUNC               m_pCFunc;
179 };
180
181 class WrapMexFunction : public Function
182 {
183 private :
184     WrapMexFunction(WrapMexFunction* _pWrapFunction);
185 public :
186     WrapMexFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
187
188     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
189     WrapMexFunction*        clone();
190
191     MEXGW_FUNC              getFunc()
192     {
193         return m_pOldFunc;
194     }
195
196 private :
197     MEXGW_FUNC              m_pOldFunc;
198 };
199
200 class DynamicFunction : public Function
201 {
202 private :
203     DynamicFunction(DynamicFunction* _pDynamicFunction);
204 public :
205     DynamicFunction(const std::wstring& _wstName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
206
207     virtual ~DynamicFunction();
208
209     DynamicFunction(const std::wstring& _wstName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, const std::wstring& _wstLoadDepsName, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
210     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
211
212 private :
213     Callable::ReturnValue   Init();
214     void                    Clear();
215
216     std::wstring            m_wstLibName;
217     std::wstring            m_wstEntryPoint;
218     std::wstring            m_wstLoadDepsName;
219     bool                    m_bCloseLibAfterCall;
220     FunctionType            m_iType;
221     GW_FUNC                 m_pFunc;
222     GW_FUNC_OPT             m_pOptFunc;
223     OLDGW_FUNC              m_pOldFunc;
224     GW_C_FUNC               m_pCFunc;
225     MEXGW_FUNC              m_pMexFunc;
226     Function*               m_pFunction;
227 };
228
229 }
230
231
232 #endif /* !__FUNCTION_HXX__ */