96aeb292e1511dda01e571f8e7e0b791466b7abe
[scilab.git] / scilab / modules / ast / src / cpp / operations / types_comparison_ne.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 #include "types_comparison_ne.hxx"
14 #include "types_comparison_eq.hxx"
15 #include "bool.hxx"
16 #include "mlist.hxx"
17 #include "context.hxx"
18
19 using namespace types;
20
21 InternalType *GenericComparisonNonEqual(InternalType *_pLeftOperand, InternalType *_pRightOperand)
22 {
23     if (_pLeftOperand->isSparse() && _pRightOperand->isSparse())
24     {
25         InternalType *pResult = NULL;
26         Sparse* pL = _pLeftOperand->getAs<Sparse>();
27         Sparse* pR = _pRightOperand->getAs<Sparse>();
28
29         int iResult = NotEqualToSparseAndSparse(pL, pR, (GenericType**)&pResult);
30         if (iResult)
31         {
32             throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
33         }
34
35         return pResult;
36     }
37     else if ((_pLeftOperand->isTList() && _pRightOperand->isTList()) ||
38              (_pLeftOperand->isMList() && _pRightOperand->isMList()))
39     {
40         TList* pLL = _pLeftOperand->getAs<TList>();
41         TList* pLR = _pRightOperand->getAs<TList>();
42
43         // check if an overload exists
44         std::wstring function_name;
45         function_name = L"%" + pLL->getShortTypeStr() + L"_n_" + pLR->getShortTypeStr();
46         InternalType* pFunc = symbol::Context::getInstance()->get(symbol::Symbol(function_name));
47
48         if (pFunc)
49         {
50             //call overload
51             return NULL;
52         }
53
54         if (pLL->getSize() != pLR->getSize())
55         {
56             return new Bool(true);
57         }
58
59         if (pLL->getSize() == 0 && pLR->getSize() == 0)
60         {
61             //list() == list() -> return true
62             return new Bool(false);
63         }
64
65         Bool* pB = new Bool(1, pLL->getSize());
66         for (int i = 0 ; i < pLL->getSize() ; i++)
67         {
68             pB->set(i, *pLL->get(i) != *pLR->get(i));
69         }
70
71         return pB;
72     }
73     else
74     {
75         InternalType* pResult = GenericComparisonEqual(_pLeftOperand, _pRightOperand);
76         if (pResult == NULL)
77         {
78             //to call overloading
79             return NULL;
80         }
81
82         if (pResult->isBool())
83         {
84             Bool *pB = pResult->getAs<Bool>();
85             for (int i = 0 ; i < pB->getSize() ; i++)
86             {
87                 pB->set(i, pB->get(i) == 0);
88             }
89             return pB;
90         }
91         else if (pResult->isSparseBool())
92         {
93             SparseBool *pSB = pResult->getAs<SparseBool>();
94             for (int i = 0 ; i < pSB->getRows() ; i++)
95             {
96                 for (int j = 0 ; j < pSB->getCols() ; j++)
97                 {
98                     pSB->set(i, j, !pSB->get(i, j));
99                 }
100             }
101             return pSB;
102         }
103     }
104
105     return NULL;
106 }
107
108 int NotEqualToSparseAndSparse(Sparse* _pSparse1, Sparse* _pSparse2, GenericType** _pOut)
109 {
110     if ((_pSparse1->getRows() == _pSparse2->getRows() && _pSparse1->getCols() == _pSparse2->getCols()) //matrix case
111             || _pSparse1->isScalar() || _pSparse2->isScalar()) //scalar cases
112     {
113         *_pOut = _pSparse1->newNotEqualTo(*_pSparse2);
114     }
115     else
116     {
117         *_pOut = new Bool(true);
118     }
119
120     return 0;
121 }