elementary_functions module.
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / cpp / sci_kron.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - DIGITEO - Cedric DELAMARRE
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 "elem_func_gw.hxx"
14 #include "function.hxx"
15 #include "double.hxx"
16 #include "overload.hxx"
17 #include "execvisitor.hxx"
18 #include "types_kronecker.hxx"
19
20
21 extern "C"
22 {
23 #include "Scierror.h"
24 #include "localization.h"
25 }
26
27 /*--------------------------------------------------------------------------*/
28 types::Function::ReturnValue sci_kron(types::typed_list &in, int _iRetCount, types::typed_list &out)
29 {
30     types::Double* pDblA    = NULL;
31     types::Double* pDblB    = NULL;
32     types::Double* pDblOut  = NULL;
33
34     if (in.size() != 2)
35     {
36         ScierrorW(77, _W("%ls: Wrong number of input argument(s): %d expected.\n"), L"kron", 2);
37         return types::Function::Error;
38     }
39
40     if (_iRetCount > 1)
41     {
42         ScierrorW(78, _W("%ls: Wrong number of output argument(s): %d expected.\n"), L"kron", 1);
43         return types::Function::Error;
44     }
45
46     if (in[0]->isDouble() && in[1]->isDouble()) // double .*. double
47     {
48         pDblA = in[0]->getAs<types::Double>();
49         pDblB = in[1]->getAs<types::Double>();
50
51         KroneckerMultiplyDoubleByDouble(pDblA, pDblB, &pDblOut);
52     }
53     else if (in[0]->isInt() || in[1]->isInt())
54     {
55         // int .*. double || double .*. int || int .*. int
56         std::wstring wstFuncName = L"%_kron";
57         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
58     }
59     else
60     {
61         std::wstring wstFuncName = L"%"  + in[0]->getShortTypeStr() + L"_kron";
62         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
63     }
64
65     out.push_back(pDblOut);
66     return types::Function::OK;
67 }
68 /*--------------------------------------------------------------------------*/