GPL + CeCILL Header change
[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  * === LICENSE_END ===
14  *
15  */
16
17 #ifndef __MACRO_HXX__
18 #define __MACRO_HXX__
19
20 #include <list>
21 #include <string>
22 #include "context.hxx"
23 #include "types.hxx"
24 #include "callable.hxx"
25 #include "double.hxx"
26 #include "seqexp.hxx"
27
28 namespace types
29 {
30 class EXTERN_AST Macro : public Callable
31 {
32 public :
33     Macro() : Callable(),
34         m_Nargin(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"nargin"))),
35         m_Nargout(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"nargout"))),
36         m_Varargin(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"varargin"))),
37         m_Varargout(symbol::Context::getInstance()->getOrCreate(symbol::Symbol(L"varargout")))
38     {
39     }
40
41     Macro(const std::wstring& _stName, std::list<symbol::Variable*> &_inputArgs, std::list<symbol::Variable*> &_outputArgs, ast::SeqExp &_body, const std::wstring& _stModule);
42     virtual                     ~Macro();
43
44     // FIXME : Should not return NULL;
45     Macro*                      clone();
46
47     inline ScilabType           getType(void)
48     {
49         return ScilabMacro;
50     }
51     inline ScilabId             getId(void)
52     {
53         return IdMacro;
54     }
55     bool                        isMacro()
56     {
57         return true;
58     }
59
60     void                        whoAmI();
61
62     bool                        toString(std::wostringstream& ostr);
63
64     Callable::ReturnValue       call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
65
66     inline void cleanCall(symbol::Context * pContext, int oldPromptMode);
67
68     ast::SeqExp*                getBody();
69
70     /* return type as string ( double, int, cell, list, ... )*/
71     virtual std::wstring        getTypeStr()
72     {
73         return L"function";
74     }
75     /* return type as short string ( s, i, ce, l, ... )*/
76     virtual std::wstring        getShortTypeStr()
77     {
78         return L"function";
79     }
80
81     const std::wstring&         getFileName()
82     {
83         return m_stPath;
84     }
85
86     void                        setFileName(const std::wstring& _fileName)
87     {
88         m_stPath = _fileName;
89     }
90
91     std::list<symbol::Variable*>*   getInputs();
92     std::list<symbol::Variable*>*   getOutputs();
93
94     virtual int getNbInputArgument(void);
95     virtual int getNbOutputArgument(void);
96
97     bool operator==(const InternalType& it);
98
99     void add_submacro(const symbol::Symbol& s, Macro* macro);
100
101     inline const std::map<symbol::Variable*, Macro*> & getSubMacros() const
102     {
103         return m_submacro;
104     }
105
106     inline const std::map<symbol::Variable*, Macro*> & getSubMacros()
107     {
108         return m_submacro;
109     }
110
111 private :
112     std::list<symbol::Variable*>*   m_inputArgs;
113     std::list<symbol::Variable*>*   m_outputArgs;
114     ast::SeqExp*                    m_body;
115     bool                            bAutoAlloc;
116     symbol::Variable*               m_Nargin;
117     symbol::Variable*               m_Nargout;
118     symbol::Variable*               m_Varargin;
119     symbol::Variable*               m_Varargout;
120     Double*                         m_pDblArgIn;
121     Double*                         m_pDblArgOut;
122     std::map<symbol::Variable*, Macro*> m_submacro;
123     std::wstring                    m_stPath;
124 };
125 }
126
127
128 #endif /* !__MACRO_HXX__ */