f7423e4f5bdc43aae9a911519a76827b0031e39d
[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     bool                        getMemory(long long* _piSize, long long* _piSizePlusType);
70
71     /* return type as string ( double, int, cell, list, ... )*/
72     virtual std::wstring        getTypeStr() const
73     {
74         return L"function";
75     }
76     /* return type as short string ( s, i, ce, l, ... )*/
77     virtual std::wstring        getShortTypeStr() const
78     {
79         return L"function";
80     }
81
82     const std::wstring&         getFileName() const
83     {
84         return m_stPath;
85     }
86
87     void                        setFileName(const std::wstring& _fileName)
88     {
89         m_stPath = _fileName;
90     }
91
92     std::list<symbol::Variable*>*   getInputs();
93     std::list<symbol::Variable*>*   getOutputs();
94
95     virtual int getNbInputArgument(void);
96     virtual int getNbOutputArgument(void);
97
98     bool operator==(const InternalType& it);
99
100     void add_submacro(const symbol::Symbol& s, Macro* macro);
101
102     inline const std::map<symbol::Variable*, Macro*> & getSubMacros() const
103     {
104         return m_submacro;
105     }
106
107     inline const std::map<symbol::Variable*, Macro*> & getSubMacros()
108     {
109         return m_submacro;
110     }
111
112 private :
113     std::list<symbol::Variable*>*   m_inputArgs;
114     std::list<symbol::Variable*>*   m_outputArgs;
115     ast::SeqExp*                    m_body;
116     bool                            bAutoAlloc;
117     symbol::Variable*               m_Nargin;
118     symbol::Variable*               m_Nargout;
119     symbol::Variable*               m_Varargin;
120     symbol::Variable*               m_Varargout;
121     Double*                         m_pDblArgIn;
122     Double*                         m_pDblArgOut;
123     std::map<symbol::Variable*, Macro*> m_submacro;
124     std::wstring                    m_stPath;
125 };
126 }
127
128
129 #endif /* !__MACRO_HXX__ */