fix some gcc 4.9 valid warnings
[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 * 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
14 #include "boolean_gw.hxx"
15 #include "function.hxx"
16 #include "double.hxx"
17 #include "sparse.hxx"
18 #include "bool.hxx"
19 #include "overload.hxx"
20 #include "execvisitor.hxx"
21
22 extern "C"
23 {
24 #include "localization.h"
25 #include "Scierror.h"
26 }
27 /*--------------------------------------------------------------------------*/
28
29 types::Function::ReturnValue sci_bool2s(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     types::InternalType* pOut = NULL;
32     if (in.size() != 1)
33     {
34         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "bool2s", 1);
35         return types::Function::Error;
36     }
37
38     if (in[0]->isDouble())
39     {
40         types::Double* pIn = in[0]->getAs<types::Double>();
41
42         if (pIn->isComplex())
43         {
44             ast::ExecVisitor exec;
45             std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
46             return Overload::call(wstFuncName, in, _iRetCount, out, &exec);
47         }
48
49         types::Double* pD = new types::Double(pIn->getDims(), pIn->getDimsArray());
50
51         double* pdblIn  = pIn->get();
52         double* pdblOut = pD->get();
53
54         for (int i = 0 ; i < pIn->getSize() ; i++)
55         {
56             pdblOut[i] = static_cast<double>(pdblIn[i] != 0);
57         }
58         pOut = pD;
59     }
60     else if (in[0]->isBool())
61     {
62         types::Bool* pIn = in[0]->getAs<types::Bool>();
63         types::Double* pD = new types::Double(pIn->getDims(), pIn->getDimsArray());
64
65         int* piIn = pIn->get();
66         double* pdblOut = pD->get();
67
68         for (int i = 0 ; i < pIn->getSize() ; i++)
69         {
70             pdblOut[i] = static_cast<double>(piIn[i]);
71         }
72         pOut = pD;
73     }
74     else if (in[0]->isSparse())
75     {
76         types::Sparse* pSpIn = in[0]->getAs<types::Sparse>();
77
78         if (pSpIn->isComplex())
79         {
80             ast::ExecVisitor exec;
81             std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
82             return Overload::call(wstFuncName, in, _iRetCount, out, &exec);
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     }
106     else if (in[0]->isSparseBool())
107     {
108         types::SparseBool* pSpbIn = in[0]->getAs<types::SparseBool>();
109         types::Sparse* pSpOut = new types::Sparse(pSpbIn ->getRows(), pSpbIn ->getCols());
110
111         int iNonZeros = static_cast<int>(pSpbIn->nbTrue());
112
113         //coords
114         int* pRows = new int[iNonZeros * 2];
115         pSpbIn->outputRowCol(pRows);
116         int* pCols = pRows + iNonZeros;
117
118         for (int i = 0; i < iNonZeros; i++)
119         {
120             pSpOut->set(pRows[i] - 1, pCols[i] - 1, 1);
121         }
122
123         pOut = pSpOut;
124     }
125     else
126     {
127         ast::ExecVisitor exec;
128         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_bool2s";
129         return Overload::call(wstFuncName, in, _iRetCount, out, &exec);
130     }
131
132     out.push_back(pOut);
133     return types::Function::OK;
134 }
135 /*--------------------------------------------------------------------------*/