1e4bf923a9a3fb0295d08aaabbfa695a5baa4bd7
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / cpp / sci_conj.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - DIGITEO - Cedric DELAMARRE
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 #include "elem_func_gw.hxx"
17 #include "function.hxx"
18 #include "double.hxx"
19 #include "overload.hxx"
20 #include "polynom.hxx"
21
22 extern "C"
23 {
24 #include "Scierror.h"
25 #include "localization.h"
26 #include "basic_functions.h"
27 }
28
29 /*--------------------------------------------------------------------------*/
30 types::Function::ReturnValue sci_conj(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     types::Double* pDblOut      = NULL;
33     types::Polynom* pPolyOut    = NULL;
34
35     double dLeatOne = -1;
36     int iOne        = 1;
37     int iSize       = 0;
38
39     if (in.size() != 1)
40     {
41         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "conj", 1);
42         return types::Function::Error;
43     }
44
45     if (_iRetCount > 1)
46     {
47         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "conj", 1);
48         return types::Function::Error;
49     }
50
51     if (in[0]->isDouble())
52     {
53         pDblOut = in[0]->clone()->getAs<types::Double>();
54     }
55     else if (in[0]->isPoly())
56     {
57         pPolyOut = in[0]->clone()->getAs<types::Polynom>();
58         pDblOut = pPolyOut->getCoef();
59     }
60     else
61     {
62         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_conj";
63         return Overload::call(wstFuncName, in, _iRetCount, out);
64     }
65
66     iSize = pDblOut->getSize();
67     if (pDblOut->isComplex())
68     {
69         C2F(dscal)(&iSize, &dLeatOne, pDblOut->getImg(), &iOne);
70     }
71
72     if (in[0]->isDouble())
73     {
74         out.push_back(pDblOut);
75     }
76     else if (in[0]->isPoly())
77     {
78         pPolyOut->setCoef(pDblOut);
79         out.push_back(pPolyOut);
80         pDblOut->killMe();
81     }
82
83     return types::Function::OK;
84 }
85 /*--------------------------------------------------------------------------*/