Use a stack to manage "where" location
[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 *  This file must be used under the terms of the CeCILL.
6 *  This source file is licensed as described in the file COPYING, which
7 *  you should have received as part of this distribution.  The terms
8 *  are also available at
9 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #include <sstream>
14 #include "graphichandle.hxx"
15 #include "tostring_common.hxx"
16 #include "scilabexception.hxx"
17 #include "overload.hxx"
18
19 extern "C"
20 {
21 #include <stdio.h>
22 #include "localization.h"
23 #include "os_string.h"
24 #include "sci_malloc.h"
25 }
26
27 using namespace std;
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, 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 InternalType* 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     //    ast::ExecVisitor execCall;
146     //    Function* pCall = (Function*)pIT;
147     //    pCall->call(in, 1, out, &execCall);
148     //}
149
150     return true;
151 }
152
153 long long GraphicHandle::getNullValue()
154 {
155     return 0;
156 }
157
158 GraphicHandle* GraphicHandle::createEmpty(int _iDims, int* _piDims, bool /*_bComplex*/)
159 {
160     return new GraphicHandle(_iDims, _piDims);
161 }
162
163 long long GraphicHandle::copyValue(long long _hanlde)
164 {
165     return _hanlde;
166 }
167
168 void GraphicHandle::deleteAll()
169 {
170     delete[] m_pRealData;
171     m_pRealData = NULL;
172     deleteImg();
173 }
174
175 void GraphicHandle::deleteImg()
176 {
177 }
178
179 long long* GraphicHandle::allocData(int _iSize)
180 {
181     return new long long[_iSize];
182 }
183
184 bool GraphicHandle::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e)
185 {
186     if (in.size() == 0)
187     {
188         out.push_back(this);
189     }
190     else if (in.size() == 1 && in[0]->isString())
191     {
192         this->IncreaseRef();
193         in.push_back(this);
194
195         Overload::call(L"%h_e", in, 1, out, &execFunc);
196     }
197     else
198     {
199         return ArrayOf<long long>::invoke(in, opt, _iRetCount, out, execFunc, e);
200     }
201
202     return true;
203 }
204 }