* Bug 16476 fixed: now issquare can be overloaded 08/21508/7
mottelet [Mon, 22 Jun 2020 10:14:42 +0000 (12:14 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16476

gateway is simplified (no call to functions using old API).

Change-Id: I190cdcb82bad55eb47990fdf3700952b26079c98

scilab/CHANGES.md
scilab/modules/elementary_functions/includes/elem_func_gw.hxx
scilab/modules/elementary_functions/includes/gw_elementary_functions.h
scilab/modules/elementary_functions/sci_gateway/cpp/sci_issquare.cpp
scilab/modules/elementary_functions/tests/nonreg_tests/bug_16476.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%l_issquare.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%r_issquare.sci [new file with mode: 0644]

index 053255d..2ef0687 100644 (file)
@@ -360,6 +360,7 @@ Bug Fixes
 * [#16465](https://bugzilla.scilab.org/16465): Scinotes OpenRecent menu was not updated when it should.
 * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression).
 * [#16474](https://bugzilla.scilab.org/16474): `imult(%z)` crashed Scilab.
+* [#16476](https://bugzilla.scilab.org/16476): `issquare` was not overloaded.
 * [#16488](https://bugzilla.scilab.org/16488): Concatenations mixing boolean and double with at least one operand being sparse were not supported.
 * [#16496](https://bugzilla.scilab.org/16496): The `getdate` page should be rewritten: a) `getdate("s")` does NOT take leap seconds into account. b) `D=getdate(X)` is vectorized, accepts fractional seconds and returns them in `[0,1)` in D(10) instead of milliseconds. Moreover, the time referential of the result was unclear (time zone, daylight saving offset).
 * [#16508](https://bugzilla.scilab.org/16508): csvTextScan and csvRead did not handle well complex data.
@@ -380,7 +381,6 @@ Bug Fixes
 * [#16644](https://bugzilla.scilab.org/16644): `input("message:")` yielded a wrong error message about `mprintf` in case of non-interpretable input.
 * [#16654](https://bugzilla.scilab.org/16654): `interp` was leaking memory.
 
-
 ### Bugs fixed in 6.1.0:
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
index a0f267f..0027726 100644 (file)
@@ -71,6 +71,7 @@ CPP_GATEWAY_PROTOTYPE(sci_imult);
 CPP_GATEWAY_PROTOTYPE(sci_int);
 CPP_GATEWAY_PROTOTYPE(sci_isequal);
 CPP_GATEWAY_PROTOTYPE(sci_isreal);
+CPP_GATEWAY_PROTOTYPE(sci_issquare);
 CPP_GATEWAY_PROTOTYPE(sci_isvector);
 CPP_GATEWAY_PROTOTYPE(sci_kron);
 CPP_GATEWAY_PROTOTYPE(sci_linspace);
index 4ce76cd..fe92ca1 100644 (file)
@@ -70,7 +70,7 @@ STACK_GATEWAY_PROTOTYPE(sci_testmatrix);
 //STACK_GATEWAY_PROTOTYPE(sci_dec2base);
 //STACK_GATEWAY_PROTOTYPE(sci_log10);
 //C_GATEWAY_PROTOTYPE(sci_isvector);
-C_GATEWAY_PROTOTYPE(sci_issquare);
+//C_GATEWAY_PROTOTYPE(sci_issquare);
 
 #endif /*  __GW_ELEMENTARIES_FUNCTIONS__ */
 /*--------------------------------------------------------------------------*/
index ceb1b86..29bb254 100644 (file)
@@ -1,42 +1,83 @@
 /*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
-*
- * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2020 - Stéphane Mottelet
  *
  * 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.
-*
-*/
+ *
+ */
 /*--------------------------------------------------------------------------*/
+#include "function.hxx"
+#include "arrayof.hxx"
+#include "overload.hxx"
+#include "bool.hxx"
+
 extern "C"
 {
-#include "api_scilab.h"
 #include "Scierror.h"
 #include "localization.h"
-#include "gw_elementary_functions.h"
 }
 
-static const char fname[] = "issquare";
 /*--------------------------------------------------------------------------*/
-int sci_issquare(scilabEnv env, int nin, scilabVar* in, int nopt, scilabOpt opt, int nout, scilabVar* out)
+
+types::Function::ReturnValue sci_issquare(types::typed_list &in, int _iRetCount, types::typed_list &out)
 {
-    if (nin != 1)
+    if (in.size() != 1)
     {
-        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), fname, 1);
-        return 1;
+        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "issquare", 1);
+        return types::Function::Error;
     }
 
-    if (nout > 1)
+    if (out.size() >  1)
     {
-        Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), fname, 1);
-        return 1;
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "issquare", 1);
+        return types::Function::Error;
     }
 
-    out[0] = scilab_createBoolean(env, scilab_isSquare(env, in[0]));
-    return 0;
+    if (in[0]->isGenericType() && !in[0]->isList())
+    {
+        types::GenericType *pIn = in[0]->getAs<types::GenericType>();
+        int iDims = pIn->getDims();
+        bool bIsSquare = true;
+        if (iDims == 2)
+        {
+            bIsSquare = pIn->getRows() == pIn->getCols() && pIn->getSize() != 0;
+        }
+        else
+        {
+            int *piDims = pIn->getDimsArray();
+            int iRefDim = -1;
+            int iNbDimsOne = 0;
+            for (int i = 0; i < iDims; i++)
+            {
+                if (piDims[i] != 1)
+                {
+                    if (iRefDim == -1)
+                    {
+                        iRefDim = piDims[i];
+                        continue;
+                    }
+                    if (piDims[i] != iRefDim)
+                    {
+                        bIsSquare = false;
+                        break;
+                    }
+                }
+                else
+                {
+                    iNbDimsOne++;
+                }
+            }
+            //to exclude case like [4, 1, 1, 1]
+            bIsSquare = bIsSquare && (iNbDimsOne < iDims-1);
+        }
+        out.push_back(new types::Bool(bIsSquare)); 
+        return types::Function::OK;
+    }
+    else
+    {
+        std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_issquare";
+        return Overload::call(wstFuncName, in, _iRetCount, out);
+    }
 }
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16476.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16476.tst
new file mode 100644 (file)
index 0000000..072d3f6
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Stéphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16476 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16476
+//
+// <-- Short Description -->
+// issquare(1/%z) answers %F. Same issue for any other square matrix of rationals
+
+g = 1/%z;
+assert_checktrue(issquare(g));
+assert_checkfalse(issquare([g g]));
+assert_checktrue(issquare([g g;g g]));
+
diff --git a/scilab/modules/overloading/macros/%l_issquare.sci b/scilab/modules/overloading/macros/%l_issquare.sci
new file mode 100644 (file)
index 0000000..c45da9e
--- /dev/null
@@ -0,0 +1,11 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2021 - Clément DAVID
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function b = %l_issquare(l)
+    b = length(l) == 1 && issquare(l(1))
+endfunction
diff --git a/scilab/modules/overloading/macros/%r_issquare.sci b/scilab/modules/overloading/macros/%r_issquare.sci
new file mode 100644 (file)
index 0000000..f5f82d5
--- /dev/null
@@ -0,0 +1,11 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2020 - Stéphane MOTTELET
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function b = %r_issquare(r)
+    b = issquare(r.num)
+endfunction