6113d2bf879f2d00ccc8cff045417077fb09b140
[scilab.git] / scilab / modules / integer / sci_gateway / cpp / sci_int.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - 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 "int.hxx"
14 #include "double.hxx"
15 #include "bool.hxx"
16 #include "function.hxx"
17 #include "integer_gw.hxx"
18
19 extern "C"
20 {
21 #include "Scierror.h"
22 }
23
24 template <class T, class U>
25 void convert_int(U* _pIn, int _iSize, T* _pOut)
26 {
27     for (int i = 0 ; i < _iSize ; i++)
28     {
29         _pOut[i] = (T)_pIn[i];
30     }
31 }
32
33 template <class T>
34 void convertInt(types::InternalType* _pIn, T* _pOut)
35 {
36     switch (_pIn->getType())
37     {
38         case types::InternalType::ScilabBool :
39         {
40             types::Bool* pBool = _pIn->getAs<types::Bool>();
41             convert_int(pBool->get(), pBool->getSize(), _pOut->get());
42             break;
43         }
44         case types::InternalType::ScilabDouble :
45         {
46             types::Double* pD = _pIn->getAs<types::Double>();
47             convert_int(pD->get(), pD->getSize(), _pOut->get());
48             break;
49         }
50         case types::InternalType::ScilabInt8 :
51         {
52             types::Int8* pD = _pIn->getAs<types::Int8>();
53             convert_int(pD->get(), pD->getSize(), _pOut->get());
54             break;
55         }
56         case types::InternalType::ScilabUInt8 :
57         {
58             types::UInt8* pD = _pIn->getAs<types::UInt8>();
59             convert_int(pD->get(), pD->getSize(), _pOut->get());
60             break;
61         }
62         case types::InternalType::ScilabInt16 :
63         {
64             types::Int16* pD = _pIn->getAs<types::Int16>();
65             convert_int(pD->get(), pD->getSize(), _pOut->get());
66             break;
67         }
68         case types::InternalType::ScilabUInt16 :
69         {
70             types::UInt16* pD = _pIn->getAs<types::UInt16>();
71             convert_int(pD->get(), pD->getSize(), _pOut->get());
72             break;
73         }
74         case types::InternalType::ScilabInt32 :
75         {
76             types::Int32* pD = _pIn->getAs<types::Int32>();
77             convert_int(pD->get(), pD->getSize(), _pOut->get());
78             break;
79         }
80         case types::InternalType::ScilabUInt32 :
81         {
82             types::UInt32* pD = _pIn->getAs<types::UInt32>();
83             convert_int(pD->get(), pD->getSize(), _pOut->get());
84             break;
85         }
86         case types::InternalType::ScilabInt64 :
87         {
88             types::Int64* pD = _pIn->getAs<types::Int64>();
89             convert_int(pD->get(), pD->getSize(), _pOut->get());
90             break;
91         }
92         case types::InternalType::ScilabUInt64 :
93         {
94             types::UInt64* pD = _pIn->getAs<types::UInt64>();
95             convert_int(pD->get(), pD->getSize(), _pOut->get());
96             break;
97         }
98         default:
99             return;
100     }
101 }
102
103 template< class T>
104 types::Callable::ReturnValue commonInt(types::typed_list &in, int _iRetCount, types::typed_list &out, std::string _stName)
105 {
106     if (in.size() != 1)
107     {
108         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), _stName.c_str(), 1);
109         return types::Function::Error;
110     }
111
112     if (in[0]->isDouble() == false && in[0]->isInt() == false && in[0]->isBool() == false)
113     {
114         Scierror(999, _("%s: Wrong type for input argument #%d: %s, %s or %s expected.\n"), _stName.c_str(), 1, "integer", "boolean", "double");
115         return types::Function::Error;
116     }
117
118     types::GenericType* pGT = in[0]->getAs<types::GenericType>();
119     if (pGT->getDims() == 2 && pGT->getRows() == 0 && pGT->getCols() == 0)
120     {
121         out.push_back(types::Double::Empty());
122         return types::Function::OK;
123     }
124
125     T* pOut = new T(pGT->getDims(), pGT->getDimsArray());
126
127     convertInt(in[0], pOut);
128     out.push_back(pOut);
129     return types::Function::OK;
130 }
131 /*--------------------------------------------------------------------------*/
132 types::Callable::ReturnValue sci_integer8(types::typed_list &in, int _iRetCount, types::typed_list &out)
133 {
134     return commonInt<types::Int8>(in, _iRetCount, out, "int8");
135 }
136
137 types::Callable::ReturnValue sci_uinteger8(types::typed_list &in, int _iRetCount, types::typed_list &out)
138 {
139     return commonInt<types::UInt8>(in, _iRetCount, out, "uint8");
140 }
141
142 types::Callable::ReturnValue sci_integer16(types::typed_list &in, int _iRetCount, types::typed_list &out)
143 {
144     return commonInt<types::Int16>(in, _iRetCount, out, "int16");
145 }
146
147 types::Callable::ReturnValue sci_uinteger16(types::typed_list &in, int _iRetCount, types::typed_list &out)
148 {
149     return commonInt<types::UInt16>(in, _iRetCount, out, "uint16");
150 }
151
152 types::Callable::ReturnValue sci_integer32(types::typed_list &in, int _iRetCount, types::typed_list &out)
153 {
154     return commonInt<types::Int32>(in, _iRetCount, out, "int32");
155 }
156
157 types::Callable::ReturnValue sci_uinteger32(types::typed_list &in, int _iRetCount, types::typed_list &out)
158 {
159     return commonInt<types::UInt32>(in, _iRetCount, out, "uint32");
160 }
161
162 types::Callable::ReturnValue sci_integer64(types::typed_list &in, int _iRetCount, types::typed_list &out)
163 {
164     return commonInt<types::Int64>(in, _iRetCount, out, "int64");
165 }
166
167 types::Callable::ReturnValue sci_uinteger64(types::typed_list &in, int _iRetCount, types::typed_list &out)
168 {
169     return commonInt<types::UInt64>(in, _iRetCount, out, "uint64");
170 }
171 /*--------------------------------------------------------------------------*/