add function::createfunction with optional list AND loaddeps
[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 void (*LOAD_DEPS)(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(std::wstring _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
54     ~Function();
55
56     //FIXME : Should not return NULL
57     InternalType*           clone();
58
59     static Function*        createFunction(std::wstring _wstName, GW_FUNC _pFunc, std::wstring _wstModule);
60     static Function*        createFunction(std::wstring _wstName, GW_FUNC_OPT _pFunc, std::wstring _wstModule);
61     static Function*        createFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, std::wstring _wstModule);
62     static Function*        createFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, std::wstring _wstModule);
63     static Function*        createFunction(std::wstring _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
64     static Function*        createFunction(std::wstring _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
65     static Function*        createFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
66     static Function*        createFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
67
68     /*dynamic gateways*/
69     static Function*        createFunction(std::wstring _wstFunctionName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
70     static Function*        createFunction(std::wstring _wstFunctionName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, std::wstring _wstLoadDepsName, 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, ast::ConstVisitor* execFunc);
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 protected:
113     LOAD_DEPS               m_pLoadDeps;
114
115 private :
116     GW_FUNC                 m_pFunc;
117 };
118
119 class OptFunction : public Function
120 {
121 private :
122     OptFunction(OptFunction* _Function);
123 public :
124     OptFunction(std::wstring _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
125
126     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
127     InternalType*           clone();
128
129     GW_FUNC_OPT             getFunc()
130     {
131         return m_pFunc;
132     }
133
134 private :
135     GW_FUNC_OPT             m_pFunc;
136 };
137
138
139 class WrapFunction : public Function
140 {
141 private :
142     WrapFunction(WrapFunction* _pWrapFunction);
143 public :
144     WrapFunction(std::wstring _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
145
146     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
147     InternalType*           clone();
148
149     OLDGW_FUNC              getFunc()
150     {
151         return m_pOldFunc;
152     }
153
154 private :
155     OLDGW_FUNC              m_pOldFunc;
156 };
157
158 class WrapMexFunction : public Function
159 {
160 private :
161     WrapMexFunction(WrapMexFunction* _pWrapFunction);
162 public :
163     WrapMexFunction(std::wstring _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, std::wstring _wstModule);
164
165     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
166     InternalType*           clone();
167
168     MEXGW_FUNC              getFunc()
169     {
170         return m_pOldFunc;
171     }
172
173 private :
174     MEXGW_FUNC              m_pOldFunc;
175 };
176
177 class DynamicFunction : public Function
178 {
179 private :
180     DynamicFunction(DynamicFunction* _pDynamicFunction);
181 public :
182     DynamicFunction(std::wstring _wstName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
183
184     virtual ~DynamicFunction();
185
186     DynamicFunction(std::wstring _wstName, std::wstring _wstEntryPointName, std::wstring _wstLibName, FunctionType _iType, std::wstring _wstLoadDepsName, std::wstring _wstModule, bool _bCloseLibAfterCall = false);
187     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc);
188 private :
189     Callable::ReturnValue   Init();
190     void                    Clear();
191
192     std::wstring            m_wstLibName;
193     std::wstring            m_wstEntryPoint;
194     std::wstring            m_wstLoadDepsName;
195     bool                    m_bCloseLibAfterCall;
196     FunctionType            m_iType;
197     GW_FUNC                 m_pFunc;
198     GW_FUNC_OPT             m_pOptFunc;
199     OLDGW_FUNC              m_pOldFunc;
200     MEXGW_FUNC              m_pMexFunc;
201     Function*               m_pFunction;
202 };
203
204 }
205
206
207 #endif /* !__FUNCTION_HXX__ */