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