* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / types / matrixiterator.hxx
index 5fc5551..c74b61b 100644 (file)
@@ -2,11 +2,14 @@
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 *  Copyright (C) 2008-2008 - DIGITEO - Bernard HUGUENEY
 *
-*  This file must be used under the terms of the CeCILL.
-*  This source file is licensed as described in the file COPYING, which
-*  you should have received as part of this distribution.  The terms
-*  are also available at
-*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
 *
 */
 #ifndef MATRIXITERATORS_HXX
@@ -162,7 +165,12 @@ template<> bool set(types::Sparse::RealSparse_t& s, int r, int c, double v)
 {
     if (v != 0.)
     {
-        s.insert(r, c) = v;
+        if (s.isCompressed() && s.coeff(r, c) == 0)
+        {
+            s.reserve(s.nonZeros() + 1);
+        }
+
+        s.coeffRef(r, c) = v;
     }
     return true;
 }
@@ -171,7 +179,12 @@ template<> bool set(types::Sparse::RealSparse_t& s, int r, int c, std::complex<d
 {
     if ( v.real() != 0.)
     {
-        s.insert(r, c) = v.real();
+        if (s.isCompressed() && s.coeff(r, c) == 0)
+        {
+            s.reserve(s.nonZeros() + 1);
+        }
+
+        s.coeffRef(r, c) = v.real();
     }
     return  true;
 }
@@ -180,20 +193,29 @@ template<> bool set(types::Sparse::CplxSparse_t& s, int r, int c, double v)
 {
     if (v != 0.)
     {
-        s.insert(r, c) = std::complex<double>(v);
+        if (s.isCompressed() && s.coeff(r, c) == 0.)
+        {
+            s.reserve(s.nonZeros() + 1);
+        }
+
+        s.coeffRef(r, c) = std::complex<double>(v);
     }
     return true;
 }
 
 namespace
 {
-std::complex<double> const cplxZero(0., 0.);
 }
 template<> bool set(types::Sparse::CplxSparse_t& s, int r, int c, std::complex<double> v)
 {
-    if (v != cplxZero)
+    if (v != 0.)
     {
-        s.insert(r, c) = v;
+        if (s.isCompressed() && s.coeff(r, c) == 0.)
+        {
+            s.reserve(s.nonZeros() + 1);
+        }
+
+        s.coeffRef(r, c) = v;
     }
     return true;
 }
@@ -202,7 +224,12 @@ template<> bool set(types::SparseBool::BoolSparse_t& s, int r, int c, bool v)
 {
     if (v)
     {
-        s.insert(r, c) = v;
+        if (s.isCompressed() && s.coeff(r, c) == false)
+        {
+            s.reserve(s.nonZeros() + 1);
+        }
+
+        s.coeffRef(r, c) = v;
     }
     return true;
 }