edea02097527c68bf7528c252ea3a843433a756d
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #ifndef __FUNCTION_HXX__
18 #define __FUNCTION_HXX__
19
20
21 #ifdef _MSC_VER
22 #pragma warning(disable: 4251)
23 #endif
24
25 #include <string>
26 #include "types.hxx"
27 #include "callable.hxx"
28
29 extern "C"
30 {
31 #include "c_gateway_prototype.h"
32 #include "dynamiclibrary.h"
33 }
34
35 #define MAX_OUTPUT_VARIABLE             64
36
37 namespace types
38 {
39 class EXTERN_AST Function : public Callable
40 {
41 public :
42     enum FunctionType
43     {
44         EntryPointOldC = 0,
45         EntryPointCPP = 1,
46         EntryPointMex = 2,
47         EntryPointCPPOpt = 3,
48         EntryPointC = 4
49     };
50
51     typedef int(*LOAD_DEPS)(const std::wstring&);
52     typedef int (*INIT_MODULE)(void);
53     typedef ReturnValue (*GW_FUNC)(typed_list &in, int _iRetCount, typed_list &out);
54     typedef ReturnValue (*GW_FUNC_OPT)(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out);
55
56     Function() : Callable() {};
57     Function(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
58     ~Function();
59
60     //FIXME : Should not return NULL
61     virtual Function*       clone();
62
63     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, const std::wstring& _wstModule);
64     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, const std::wstring& _wstModule);
65     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, const std::wstring& _wstModule);
66     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, const std::wstring& _wstModule);
67     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
68     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
69     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
70     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
71     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, const std::wstring& _wstModule);
72     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
73
74     /*dynamic gateways*/
75     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);
76     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);
77
78     inline ScilabType       getType(void)
79     {
80         return ScilabFunction;
81     }
82     inline ScilabId         getId(void)
83     {
84         return IdFunction;
85     }
86
87     bool                    isFunction()
88     {
89         return true;
90     }
91
92     void                    whoAmI();
93
94     bool                    toString(std::wostringstream& ostr);
95
96     virtual ReturnValue     call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
97
98     /* return type as string ( double, int, cell, list, ... )*/
99     virtual std::wstring    getTypeStr()
100     {
101         return L"fptr";
102     }
103     /* return type as short string ( s, i, ce, l, ... )*/
104     virtual std::wstring    getShortTypeStr()
105     {
106         return L"fptr";
107     }
108
109     GW_FUNC                 getFunc()
110     {
111         return m_pFunc;
112     }
113     LOAD_DEPS               getDeps()
114     {
115         return m_pLoadDeps;
116     }
117
118 private :
119     GW_FUNC                 m_pFunc;
120
121 protected:
122     LOAD_DEPS               m_pLoadDeps;
123
124 };
125
126 class OptFunction : public Function
127 {
128 private :
129     OptFunction(OptFunction* _Function);
130 public :
131     OptFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
132
133     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
134     OptFunction*            clone();
135
136     GW_FUNC_OPT             getFunc()
137     {
138         return m_pFunc;
139     }
140
141 private:
142     GW_FUNC_OPT             m_pFunc;
143 };
144
145
146 class WrapFunction : public Function
147 {
148 private:
149     WrapFunction(WrapFunction* _pWrapFunction);
150 public:
151     WrapFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
152
153     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
154     WrapFunction*           clone();
155
156     OLDGW_FUNC              getFunc()
157     {
158         return m_pOldFunc;
159     }
160
161 private:
162     OLDGW_FUNC              m_pOldFunc;
163 };
164
165 class WrapCFunction : public Function
166 {
167 private:
168     WrapCFunction(WrapCFunction* _pWrapFunction);
169 public:
170     WrapCFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
171
172     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
173     WrapCFunction*          clone();
174
175     GW_C_FUNC               getFunc()
176     {
177         return m_pCFunc;
178     }
179
180 private:
181     GW_C_FUNC               m_pCFunc;
182 };
183
184 class WrapMexFunction : public Function
185 {
186 private :
187     WrapMexFunction(WrapMexFunction* _pWrapFunction);
188 public :
189     WrapMexFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
190
191     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
192     WrapMexFunction*        clone();
193
194     MEXGW_FUNC              getFunc()
195     {
196         return m_pOldFunc;
197     }
198
199 private :
200     MEXGW_FUNC              m_pOldFunc;
201 };
202
203 class DynamicFunction : public Function
204 {
205 private :
206     DynamicFunction(DynamicFunction* _pDynamicFunction);
207 public :
208     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);
209
210     virtual ~DynamicFunction();
211
212     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);
213     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
214
215 private :
216     Callable::ReturnValue   Init();
217     void                    Clear();
218
219     std::wstring            m_wstLibName;
220     std::wstring            m_wstEntryPoint;
221     std::wstring            m_wstLoadDepsName;
222     bool                    m_bCloseLibAfterCall;
223     FunctionType            m_iType;
224     GW_FUNC                 m_pFunc;
225     GW_FUNC_OPT             m_pOptFunc;
226     OLDGW_FUNC              m_pOldFunc;
227     GW_C_FUNC               m_pCFunc;
228     MEXGW_FUNC              m_pMexFunc;
229     Function*               m_pFunction;
230 };
231
232 }
233
234
235 #endif /* !__FUNCTION_HXX__ */