Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_cell.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - 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 #include "core_gw.hxx"
17 #include "double.hxx"
18 #include "cell.hxx"
19 #include "function.hxx"
20 #include "overload.hxx"
21
22 types::Function::ReturnValue sci_cell_gw(types::typed_list &in, int _iRetCount, types::typed_list &out)
23 {
24     types::Cell* pRetVal = NULL;
25     if (in.size() == 0)
26     {
27         //cell or cell()
28         out.push_back(new types::Cell());
29         return types::Function::OK;
30     }
31
32     for (int i = 0 ; i < in.size() ; i++)
33     {
34         if (in[i]->isDouble() == false)
35         {
36             return Overload::call("%_cell", in, _iRetCount, out);
37         }
38     }
39
40     if (in.size() == 1)
41     {
42         //cell([x])
43         types::Double *pD = in[0]->getAs<types::Double>();
44         if (pD->getSize() == 1)
45         {
46             //one value
47             pRetVal = new types::Cell((int)pD->getReal()[0], (int)pD->getReal()[0]);
48         }
49         else if (pD->getSize() == 2)
50         {
51             pRetVal = new types::Cell((int)pD->getReal()[0], (int)pD->getReal()[1]);
52         }
53         else if (pD->getSize() == 0)
54         {
55             //[]
56             pRetVal = new types::Cell(0, 0);
57         }
58         else
59         {
60             int* piDimsArray = new int[pD->getSize()];
61             for (int i = 0; i < pD->getSize(); i++)
62             {
63                 piDimsArray[i] = (int)pD->get(i);
64             }
65             pRetVal = new types::Cell(pD->getSize(), piDimsArray);
66             delete[] piDimsArray;
67         }
68     }
69     else if (in.size() == 2)
70     {
71         //cell(x,y)
72         types::Double* pD1 = in[0]->getAs<types::Double>();
73         types::Double* pD2 = in[1]->getAs<types::Double>();
74
75         pRetVal = new types::Cell(pD1->getReal()[0], pD2->getReal()[0]);
76     }
77     else
78     {
79         int* piDimsArray = new int[in.size()];
80         for (int i = 0; i < in.size(); i++)
81         {
82             piDimsArray[i] = (int)in[i]->getAs<types::Double>()->get(0);
83         }
84         pRetVal = new types::Cell(in.size(), piDimsArray);
85         delete[] piDimsArray;
86     }
87
88     if (pRetVal == NULL)
89     {
90         return types::Function::Error;
91     }
92
93     out.push_back(pRetVal);
94     return types::Function::OK;
95 }