dc78b12645c4401b8f62b8e5a69b693682e30cbe
[scilab.git] / scilab / modules / boolean / sci_gateway / cpp / sci_bool2s.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - 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
17 #include "boolean_gw.hxx"
18 #include "function.hxx"
19 #include "double.hxx"
20 #include "sparse.hxx"
21 #include "bool.hxx"
22 #include "overload.hxx"
23
24 extern "C"
25 {
26 #include "localization.h"
27 #include "Scierror.h"
28 }
29 /*--------------------------------------------------------------------------*/
30
31 types::Function::ReturnValue sci_bool2s(types::typed_list &in, int _iRetCount, types::typed_list &out)
32 {
33     types::InternalType* pOut = NULL;
34     if (in.size() != 1)
35     {
36         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "bool2s", 1);
37         return types::Function::Error;
38     }
39
40     if (in[0]->isDouble())
41     {
42         types::Double* pIn = in[0]->getAs<types::Double>();
43
44         if (pIn->isComplex())
45         {
46             std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
47             return Overload::call(wstFuncName, in, _iRetCount, out);
48         }
49
50         types::Double* pD = new types::Double(pIn->getDims(), pIn->getDimsArray());
51
52         double* pdblIn  = pIn->get();
53         double* pdblOut = pD->get();
54
55         for (int i = 0 ; i < pIn->getSize() ; i++)
56         {
57             pdblOut[i] = static_cast<double>(pdblIn[i] != 0);
58         }
59         pOut = pD;
60     }
61     else if (in[0]->isBool())
62     {
63         types::Bool* pIn = in[0]->getAs<types::Bool>();
64         types::Double* pD = new types::Double(pIn->getDims(), pIn->getDimsArray());
65
66         int* piIn = pIn->get();
67         double* pdblOut = pD->get();
68
69         for (int i = 0 ; i < pIn->getSize() ; i++)
70         {
71             pdblOut[i] = static_cast<double>(piIn[i]);
72         }
73         pOut = pD;
74     }
75     else if (in[0]->isSparse())
76     {
77         types::Sparse* pSpIn = in[0]->getAs<types::Sparse>();
78
79         if (pSpIn->isComplex())
80         {
81             std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
82             return Overload::call(wstFuncName, in, _iRetCount, out);
83         }
84
85         types::Sparse* pSpOut = new types::Sparse(pSpIn->getRows(), pSpIn->getCols());
86
87         int iNonZeros = static_cast<int>(pSpIn->nonZeros());
88
89         //coords
90         int* pRows = new int[iNonZeros * 2];
91         pSpIn->outputRowCol(pRows);
92         int* pCols = pRows + iNonZeros;
93
94         //values
95         double* pNonZeroR = new double[iNonZeros];
96         double* pNonZeroI = new double[iNonZeros];
97         pSpIn->outputValues(pNonZeroR, pNonZeroI);
98
99         for (int i = 0; i < iNonZeros; i++)
100         {
101             pSpOut->set(pRows[i] - 1, pCols[i] - 1, static_cast<double>(pNonZeroR[i] != 0));
102         }
103
104         pOut = pSpOut;
105         delete[] pNonZeroR;
106         delete[] pNonZeroI;
107         delete[] pRows;
108     }
109     else if (in[0]->isSparseBool())
110     {
111         types::SparseBool* pSpbIn = in[0]->getAs<types::SparseBool>();
112         types::Sparse* pSpOut = new types::Sparse(pSpbIn ->getRows(), pSpbIn ->getCols());
113
114         int iNonZeros = static_cast<int>(pSpbIn->nbTrue());
115
116         //coords
117         int* pRows = new int[iNonZeros * 2];
118         pSpbIn->outputRowCol(pRows);
119         int* pCols = pRows + iNonZeros;
120
121         for (int i = 0; i < iNonZeros; i++)
122         {
123             pSpOut->set(pRows[i] - 1, pCols[i] - 1, 1);
124         }
125
126         pOut = pSpOut;
127         delete[] pRows;
128     }
129     else
130     {
131         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
132         return Overload::call(wstFuncName, in, _iRetCount, out);
133     }
134
135     out.push_back(pOut);
136     return types::Function::OK;
137 }
138 /*--------------------------------------------------------------------------*/