* Bug 14606 fixed: now `[names,mem]=who()` returns memory used by variables
[scilab.git] / scilab / modules / ast / src / cpp / types / graphichandle.cpp
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 #include <sstream>
17 #include "graphichandle.hxx"
18 #include "tostring_common.hxx"
19 #include "overload.hxx"
20 #include "type_traits.hxx"
21
22 extern "C"
23 {
24 #include "localization.h"
25 #include "os_string.h"
26 #include "sci_malloc.h"
27 }
28
29 namespace types
30 {
31 /*****************
32  * GraphicHandle *
33  *****************/
34 GraphicHandle::GraphicHandle(long long _handle)
35 {
36     int piDims[2]   = {1, 1};
37     long long* pH = NULL;
38     create(piDims, 2, &pH, NULL);
39     pH[0] = _handle;
40 #ifndef NDEBUG
41     Inspector::addItem(this);
42 #endif
43 }
44
45 GraphicHandle::GraphicHandle(int _iRows, int _iCols)
46 {
47     int piDims[2]   = {_iRows, _iCols};
48     long long* pH = NULL;
49     create(piDims, 2, &pH, NULL);
50 #ifndef NDEBUG
51     Inspector::addItem(this);
52 #endif
53 }
54
55 GraphicHandle::GraphicHandle(int _iDims, const int* _piDims)
56 {
57     long long* pH = NULL;
58     create(_piDims, _iDims, &pH, NULL);
59 #ifndef NDEBUG
60     Inspector::addItem(this);
61 #endif
62 }
63
64 void GraphicHandle::whoAmI()
65 {
66     std::cout << "types::GraphicHandle";
67 }
68
69
70 GraphicHandle::~GraphicHandle()
71 {
72     if (isDeletable() == true)
73     {
74         deleteAll();
75     }
76 #ifndef NDEBUG
77     Inspector::removeItem(this);
78 #endif
79 }
80
81 GraphicHandle* GraphicHandle::clone()
82 {
83     GraphicHandle* pGH = new GraphicHandle(getDims(), getDimsArray());
84     for (int i = 0 ; i < getSize() ; i++)
85     {
86         pGH->set(i, get(i));
87     }
88     return pGH;
89 }
90
91 bool GraphicHandle::operator==(const InternalType& it)
92 {
93     if (const_cast<InternalType &>(it).isBool() == false)
94     {
95         return false;
96     }
97
98     GraphicHandle* pGH = const_cast<InternalType &>(it).getAs<types::GraphicHandle>();
99
100     if (pGH->getDims() != getDims())
101     {
102         return false;
103     }
104
105     for (int i = 0 ; i < getDims() ; i++)
106     {
107         if (pGH->getDimsArray()[i] != getDimsArray()[i])
108         {
109             return false;
110         }
111     }
112
113     for (int i = 0 ; i < getSize() ; i++)
114     {
115         if (get(i) == pGH->get(i))
116         {
117             return false;
118         }
119     }
120     return true;
121 }
122
123 bool GraphicHandle::operator!=(const InternalType& it)
124 {
125     return !(*this == it);
126 }
127
128 bool GraphicHandle::subMatrixToString(std::wostringstream& /*ostr*/, int* /*_piDims*/, int /*_iDims*/)
129 {
130     //call %h_p(h)
131     //GraphicHandle* pTemp = new GraphicHandle(_iDims, _piDims);
132     //long long* pHandle = pTemp->get();
133     //for(int i = 0 ; i < pTemp->getSize() ; i++)
134     //{
135     //    pHandle[i] = 0;
136     //}
137
138     //typed_list in;
139     //typed_list out;
140     //in.push_back(pTemp);
141
142     //InternalType* pIT = (InternalType*)context_get(L"%h_p");
143     //if(pIT->isFunction())
144     //{
145     //    Function* pCall = (Function*)pIT;
146     //    pCall->call(in, 1, out);
147     //}
148
149     return true;
150 }
151
152 long long GraphicHandle::getNullValue()
153 {
154     return 0;
155 }
156
157 GraphicHandle* GraphicHandle::createEmpty(int _iDims, int* _piDims, bool /*_bComplex*/)
158 {
159     return new GraphicHandle(_iDims, _piDims);
160 }
161
162 long long GraphicHandle::copyValue(long long _hanlde)
163 {
164     return _hanlde;
165 }
166
167 void GraphicHandle::deleteAll()
168 {
169     delete[] m_pRealData;
170     m_pRealData = NULL;
171     deleteImg();
172 }
173
174 void GraphicHandle::deleteImg()
175 {
176 }
177
178 long long* GraphicHandle::allocData(int _iSize)
179 {
180     return new long long[_iSize];
181 }
182
183 bool GraphicHandle::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e)
184 {
185     if (in.size() == 0)
186     {
187         out.push_back(this);
188     }
189     else if (in.size() == 1 && in[0]->isString())
190     {
191         this->IncreaseRef();
192         in.push_back(this);
193
194         Overload::call(L"%h_e", in, 1, out);
195     }
196     else
197     {
198         return ArrayOf<long long>::invoke(in, opt, _iRetCount, out, e);
199     }
200
201     return true;
202 }
203
204 bool GraphicHandle::transpose(InternalType *& out)
205 {
206     return type_traits::transpose(*this, out);
207 }
208
209 bool GraphicHandle::getMemory(int* _piSize, int* _piSizePlusType)
210 {
211     *_piSize = sizeof(long long)*getSize();
212     *_piSizePlusType = *_piSize + sizeof(GraphicHandle);
213     return true;
214 }
215 }