* Bug 14606 fixed: now `[names,mem]=who()` returns memory used by variables
[scilab.git] / scilab / modules / ast / includes / types / implicitlist.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
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 // This code is separated in implicitList.hxx
17 // but will be inlined in arrayof.hxx
18 //
19 // If you need additionnal headers, please add it in arrayof.hxx
20
21 //#ifndef __ARRAYOF_HXX__
22 //    #error This file must only be include by arrayof.hxx
23 //#endif
24
25 #ifndef __IMPLICITLIST_HXX__
26 #define __IMPLICITLIST_HXX__
27
28 #include "internal.hxx"
29 #include "double.hxx"
30
31 namespace types
32 {
33 /*
34 ** Type
35 */
36 class EXTERN_AST ImplicitList : public InternalType
37 {
38 protected :
39     InternalType*                       m_poStart;
40     InternalType*                       m_poStep;
41     InternalType*                       m_poEnd;
42
43     Double*                             m_pDblStart;
44     Double*                             m_pDblStep;
45     Double*                             m_pDblEnd;
46
47     int                                 m_iSize;
48
49     InternalType::ScilabType    m_eStartType;
50     InternalType::ScilabType    m_eStepType;
51     InternalType::ScilabType    m_eEndType;
52     InternalType::ScilabType    m_eOutType;
53
54     bool                        m_bComputed;
55
56 public :
57     ImplicitList();
58     virtual ~ImplicitList();
59     ImplicitList(InternalType* _poStart, InternalType* _poStep, InternalType* _poEnd);
60
61     ImplicitList* clone();
62
63     inline ScilabType getType(void)
64     {
65         return ScilabImplicitList;
66     }
67     inline ScilabId getId(void)
68     {
69         return IdImplicitList;
70     }
71
72     bool isImplicitList()
73     {
74         return true;
75     }
76
77     virtual bool isAssignable(void)
78     {
79         return true;
80     }
81
82     inline virtual bool isInvokable() const
83     {
84         return true;
85     }
86
87
88     ScilabType getOutputType();
89
90     inline InternalType* getStart()
91     {
92         return m_poStart;
93     }
94     void setStart(InternalType* _poIT);
95
96     inline InternalType* getStep()
97     {
98         return m_poStep;
99     }
100     void setStep(InternalType* _poIT);
101
102     inline InternalType* getEnd()
103     {
104         return m_poEnd;
105     }
106     void setEnd(InternalType* _poIT);
107
108     bool compute();
109     bool isComputable();
110
111     bool toString(std::wostringstream& ostr);
112
113
114     InternalType::ScilabType getStartType();
115     InternalType::ScilabType getStepType();
116     InternalType::ScilabType getEndType();
117
118     inline long long getSize()
119     {
120         return m_iSize;
121     }
122
123     //extract single value in a InternalType
124     void extractValue(int _iOccur, InternalType*); //Single value
125     void extractValueAsDouble(int _iOccur, Double*);
126     template<typename T>
127     void extractValueAsInteger(int _iOccur, T* val);
128     template<typename T>
129     void extractValueAsUnsignedInteger(int _iOccur, T* val);
130
131     InternalType* getInitalType();
132     //extract matrix in a Internaltype
133     InternalType* extractFullMatrix();
134
135     virtual InternalType* extract(typed_list* _pArgs);
136     virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e) override ;
137
138
139     /* return type as string ( double, int, cell, list, ... )*/
140     virtual std::wstring getTypeStr() const
141     {
142         return L"implicitlist";
143     }
144     /* return type as short string ( s, i, ce, l, ... )*/
145     virtual std::wstring getShortTypeStr() const
146     {
147         return L"ip";
148     }
149
150     // templated extract for
151     // double / char / short / int / long long / unsigned ...
152     template<typename T>
153     void extractFullMatrix(T *_pT);
154     void extractFullMatrix(Double *_pdbl);
155
156     virtual bool isTrue();
157
158     virtual bool transpose(InternalType *& out);
159     virtual bool neg(InternalType *& out);
160     virtual ast::Exp * getExp(const Location & loc);
161
162     bool getMemory(int* _piSize, int* _piSizePlusType);
163
164 };
165 }
166
167 #endif /* !__IMPLICITLIST_HXX__ */