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