License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / types / macro.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2009-2010 - DIGITEO - Bruno JOFRET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __MACRO_HXX__
17 #define __MACRO_HXX__
18
19 #include <list>
20 #include <string>
21 #include "context.hxx"
22 #include "types.hxx"
23 #include "callable.hxx"
24 #include "double.hxx"
25 #include "seqexp.hxx"
26
27 namespace types
28 {
29 class EXTERN_AST Macro : public Callable
30 {
31 public :
32     Macro() : Callable(),
33         m_Nargin(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"nargin"))),
34         m_Nargout(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"nargout"))),
35         m_Varargin(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"varargin"))),
36         m_Varargout(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"varargout")))
37     {
38     }
39
40     Macro(const std::wstring& _stName, std::list<symbol::Variable*> &_inputArgs, std::list<symbol::Variable*> &_outputArgs, ast::SeqExp &_body, const std::wstring& _stModule);
41     virtual                     ~Macro();
42
43     // FIXME : Should not return NULL;
44     Macro*                      clone();
45
46     inline ScilabType           getType(void)
47     {
48         return ScilabMacro;
49     }
50     inline ScilabId             getId(void)
51     {
52         return IdMacro;
53     }
54     bool                        isMacro()
55     {
56         return true;
57     }
58
59     void                        whoAmI();
60
61     bool                        toString(std::wostringstream& ostr);
62
63     Callable::ReturnValue       call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
64
65     inline void cleanCall(symbol::Context * pContext, int oldPromptMode);
66
67     ast::SeqExp*                getBody();
68
69     /* return type as string ( double, int, cell, list, ... )*/
70     virtual std::wstring        getTypeStr()
71     {
72         return L"function";
73     }
74     /* return type as short string ( s, i, ce, l, ... )*/
75     virtual std::wstring        getShortTypeStr()
76     {
77         return L"function";
78     }
79
80     const std::wstring&         getFileName()
81     {
82         return m_stPath;
83     }
84
85     void                        setFileName(const std::wstring& _fileName)
86     {
87         m_stPath = _fileName;
88     }
89
90     std::list<symbol::Variable*>*   getInputs();
91     std::list<symbol::Variable*>*   getOutputs();
92
93     virtual int getNbInputArgument(void);
94     virtual int getNbOutputArgument(void);
95
96     bool operator==(const InternalType& it);
97
98     void add_submacro(const symbol::Symbol& s, Macro* macro);
99
100     inline const std::map<symbol::Variable*, Macro*> & getSubMacros() const
101     {
102         return m_submacro;
103     }
104
105     inline const std::map<symbol::Variable*, Macro*> & getSubMacros()
106     {
107         return m_submacro;
108     }
109
110 private :
111     std::list<symbol::Variable*>*   m_inputArgs;
112     std::list<symbol::Variable*>*   m_outputArgs;
113     ast::SeqExp*                    m_body;
114     bool                            bAutoAlloc;
115     symbol::Variable*               m_Nargin;
116     symbol::Variable*               m_Nargout;
117     symbol::Variable*               m_Varargin;
118     symbol::Variable*               m_Varargout;
119     Double*                         m_pDblArgIn;
120     Double*                         m_pDblArgOut;
121     std::map<symbol::Variable*, Macro*> m_submacro;
122     std::wstring                    m_stPath;
123 };
124 }
125
126
127 #endif /* !__MACRO_HXX__ */