* Bug 16102 fixed: lstcat() with 1:$, sin, sind.. & might be slow 96/20996/6
Samuel GOUGEON [Sat, 1 Jun 2019 06:04:29 +0000 (08:04 +0200)]
  http://bugzilla.scilab.org/16102

  Requires merging https://codereview.scilab.org/20995 first

  Compared speeds:
--> L =list(); L(1e6) = 1;
  Former implementation:
--> tic(); lstcat(L,L); toc()
 ans  =
   44.126577

  With this patch:
--> tic(); lstcat(L,L); toc()
 ans  =
   1.7306356

Change-Id: If60fbb73ce0237b058d90a7c5e2f08a6359743c8

scilab/CHANGES.md
scilab/modules/data_structures/macros/lstcat.sci
scilab/modules/data_structures/tests/unit_tests/lstcat.dia.ref [deleted file]
scilab/modules/data_structures/tests/unit_tests/lstcat.tst

index 0612862..f61eec0 100644 (file)
@@ -307,6 +307,7 @@ Bug Fixes
 * [#16089](http://bugzilla.scilab.org/show_bug.cgi?id=16089): x=1:1e10 freezed Scilab.
 * [#16095](http://bugzilla.scilab.org/show_bug.cgi?id=16095): For a matrix of graphic handles of same types, it was no longer possible to clear a property by assigning [].
 * [#16097](http://bugzilla.scilab.org/show_bug.cgi?id=16097): `coth()` was more than twice slower than `1./tanh()`. `tanh` and `coth` did not accept sparse-encoded input.
+* [#16102](http://bugzilla.scilab.org/show_bug.cgi?id=16102): `lstcat` could not concatenate input lists with mixed objects of types>10 like 1:$, sin, sind, struct, cells, tlists or mlists. In addition, it was slow for very long inputs lists.
 * [#16104](http://bugzilla.scilab.org/show_bug.cgi?id=16104): `assert_checkequal` did not support properly or at all Nan and void in lists, Nan in sparse, implicit lists, macros, libraries, built-in functions, graphical handles. For input arrays or lists of matching typeof and sizes, the failure message did not display neither the index nor the values of the first mismatching elements.
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
 * [#16118](http://bugzilla.scilab.org/show_bug.cgi?id=16118): `%s <> (1+%s)` returned %F.
index 8bbd9c0..c22e816 100644 (file)
 // along with this program.
 
 
-function l=lstcat(varargin)
+function l = lstcat(varargin)
     // concat inputs in a list
 
-    rhs=argn(2);
+    rhs = argn(2);
     l = list();
-
     if rhs==0 then
         return;
     end
 
-    for i=1:rhs
+    l = varargin(1)
+    if type(l)<>15 then
+        l = list(l)
+        L = 1
+    else
+        L = length(l)
+    end
+
+    for i = 2:rhs
         var = varargin(i);
         if type(var) == 15 then
-            for j = 1 : size(var)
-                l($ + 1) = var(j);
+            Lvar = length(var)
+            if Lvar>0
+                if Lvar < 100
+                    l(L+Lvar) = var($)
+                    for j = 1:Lvar-1
+                        l(L+j) = var(j)
+                    end
+                else
+                    l = list(l(:), var(:))
+                end
+                L = L + Lvar
             end
-        elseif type(var) <= 10 then
+        else
             l($ + 1) = var;
+            L = L + 1;
         end
     end
 endfunction
diff --git a/scilab/modules/data_structures/tests/unit_tests/lstcat.dia.ref b/scilab/modules/data_structures/tests/unit_tests/lstcat.dia.ref
deleted file mode 100644 (file)
index 5c8b9fd..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) ????-2008 - INRIA
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-if or(lstcat(list(1,2),list(4))<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list(1,2,4),list())<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list(1),list(2,4))<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list(),list(1,2,4))<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list(1,2),4)<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(1,list(2,4))<>list(1,2,4)) then bugmes();quit;end
-if or(lstcat(list(1),list(2),list(4))<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list(1,2),list(),4)<>list(1,2,4))  then bugmes();quit;end
-if or(lstcat(list([1 2],['my string';'matrix']),list('foo',%s))<>list([1 2],..
-  ['my string';'matrix'],'foo',%s)) then bugmes();quit;end
index ecdcca5..263c4cd 100644 (file)
@@ -1,22 +1,32 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) ????-2008 - INRIA
+// Copyright (C) 2019 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
-if or(lstcat(list(1,2),list(4))<>list(1,2,4))  then pause,end
-if or(lstcat(list(1,2,4),list())<>list(1,2,4))  then pause,end
-if or(lstcat(list(1),list(2,4))<>list(1,2,4))  then pause,end
-if or(lstcat(list(),list(1,2,4))<>list(1,2,4))  then pause,end
+assert_checkequal(lstcat(list(1,2),list(4)), list(1,2,4));
+assert_checkequal(lstcat(list(1,2,4),list()), list(1,2,4));
+assert_checkequal(lstcat(list(1),list(2,4)), list(1,2,4));
+assert_checkequal(lstcat(list(),list(1,2,4)), list(1,2,4));
 
-if or(lstcat(list(1,2),4)<>list(1,2,4))  then pause,end
-if or(lstcat(1,list(2,4))<>list(1,2,4)) then pause,end
+assert_checkequal(lstcat(list(1,2), 4), list(1,2,4));
+assert_checkequal(lstcat(1, list(2,4)), list(1,2,4));
 
-if or(lstcat(list(1),list(2),list(4))<>list(1,2,4))  then pause,end
+assert_checkequal(lstcat(list(1), list(2), list(4)), list(1,2,4));
+assert_checkequal(lstcat(list(1,2),list(),4), list(1,2,4));
 
-if or(lstcat(list(1,2),list(),4)<>list(1,2,4))  then pause,end
+L = lstcat(list([1 2],['my string';'matrix']), list('foo',%s));
+assert_checkequal(L, list([1 2],['my string';'matrix'], 'foo', %s));
 
-if or(lstcat(list([1 2],['my string';'matrix']),list('foo',%s))<>list([1 2],..
-  ['my string';'matrix'],'foo',%s)) then pause,end
+sp = sprand(100,100,0.01);
+m = rand(100,100);
+L1 = list(%z, m , sp, sp<>0, "abc", list(%f,,"defg"));
+L2 = list(sin, 1:$, , list(cosd, , %pi));
+     // include gdf() after fixing http://bugzilla.scilab.org/16103
+Lres = list(%z, m , sp, sp<>0, "abc", list(%f,,"defg"), ..
+            2:$, sind, sin, 1:$, , list(cosd, , %pi), cos);
+assert_checkequal(lstcat(L1, 2:$, sind, L2, cos), Lres);