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