improve a little bit the bool2s speed.
[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         int iSize = pIn->getSize();
56         for (int i = 0 ; i < iSize ; i++)
57         {
58             pdblOut[i] = static_cast<double>(pdblIn[i] != 0);
59         }
60         pOut = pD;
61     }
62     else if (in[0]->isBool())
63     {
64         types::Bool* pIn = in[0]->getAs<types::Bool>();
65         types::Double* pD = new types::Double(pIn->getDims(), pIn->getDimsArray());
66
67         int* piIn = pIn->get();
68         double* pdblOut = pD->get();
69
70         int iSize = pIn->getSize();
71         for (int i = 0 ; i < iSize ; i++)
72         {
73             pdblOut[i] = static_cast<double>(piIn[i]);
74         }
75         pOut = pD;
76     }
77     else if (in[0]->isSparse())
78     {
79         types::Sparse* pSpIn = in[0]->getAs<types::Sparse>();
80
81         if (pSpIn->isComplex())
82         {
83             std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
84             return Overload::call(wstFuncName, in, _iRetCount, out);
85         }
86
87         types::Sparse* pSpOut = new types::Sparse(pSpIn->getRows(), pSpIn->getCols());
88
89         int iNonZeros = static_cast<int>(pSpIn->nonZeros());
90
91         //coords
92         int* pRows = new int[iNonZeros * 2];
93         pSpIn->outputRowCol(pRows);
94         int* pCols = pRows + iNonZeros;
95
96         //values
97         double* pNonZeroR = new double[iNonZeros];
98         double* pNonZeroI = new double[iNonZeros];
99         pSpIn->outputValues(pNonZeroR, pNonZeroI);
100
101         for (int i = 0; i < iNonZeros; i++)
102         {
103             pSpOut->set(pRows[i] - 1, pCols[i] - 1, static_cast<double>(pNonZeroR[i] != 0));
104         }
105
106         pOut = pSpOut;
107         delete[] pNonZeroR;
108         delete[] pNonZeroI;
109         delete[] pRows;
110     }
111     else if (in[0]->isSparseBool())
112     {
113         types::SparseBool* pSpbIn = in[0]->getAs<types::SparseBool>();
114         types::Sparse* pSpOut = new types::Sparse(pSpbIn ->getRows(), pSpbIn ->getCols());
115
116         int iNonZeros = static_cast<int>(pSpbIn->nbTrue());
117
118         //coords
119         int* pRows = new int[iNonZeros * 2];
120         pSpbIn->outputRowCol(pRows);
121         int* pCols = pRows + iNonZeros;
122
123         for (int i = 0; i < iNonZeros; i++)
124         {
125             pSpOut->set(pRows[i] - 1, pCols[i] - 1, 1);
126         }
127
128         pOut = pSpOut;
129         delete[] pRows;
130     }
131     else
132     {
133         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
134         return Overload::call(wstFuncName, in, _iRetCount, out);
135     }
136
137     out.push_back(pOut);
138     return types::Function::OK;
139 }
140 /*--------------------------------------------------------------------------*/