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