* Bug 15859 fixed: isempty() overloadable for tlists & mlists
[scilab.git] / scilab / modules / elementary_functions / macros / isempty.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 1998 - INRIA
3 // Copyright (C) DIGITEO - 2011-2012 - Allan CORNET
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 // Copyright (C) 2016, 2018 - Samuel GOUGEON
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 function answ = isempty(m)
15
16     rhs = argn(2);
17     if rhs <> 1 then
18         msg = gettext("%s: Wrong number of input argument(s): %d expected.\n")
19         error(msprintf(msg, "isempty", 1))
20     end
21
22     m_type = type(m);
23
24     if( (m_type >= 11) & (m_type <= 13) | (m_type >= 128) ) then
25         msg = gettext("%s: Wrong type for input argument #%d.\n")
26         error(msprintf(msg, "isempty", 1))
27     end
28
29     select m_type
30     case 1
31         answ = m == [];
32     case 10
33         // matrix of character string
34         answ = ( max(length(m)) == 0 );
35
36     case 15
37         // list
38         answ = %t;
39         for i = 1:size(m),
40             answ = answ & (type(m(i))==0 || isempty(m(i)))
41             if ~answ
42                 break
43             end
44         end;
45
46     case 16
47         // typed list
48         if typeof(m) == "rational" then
49             answ = size(m, "*") == 0;
50         else
51             oname = "%" + typeof(m) + "_isempty"
52             if isdef(oname,"n")
53                 execstr("answ = "+oname+"(m)")
54                 return
55             end
56             answ = %t;
57             for i = 2:size(m)
58                 answ = answ & (type(m(i))==0 || isempty(m(i)))
59                 if ~answ
60                     break
61                 end
62             end
63         end
64
65     case 17
66         // mlist
67         answ = %t
68         if typeof(m)=="ce"      // array of cells
69             if size(m,"*")==1
70                 answ = answ & isempty(m{1})
71             else
72                 n = size(m,"*")
73                 for i = 1:n
74                     answ = answ & isempty(m(i))
75                     if ~answ
76                         break
77                     end
78                 end
79             end
80
81         elseif typeof(m)=="st"    // array of structures
82             fn = fieldnames(m)
83             if size(m, "*")>0 && fn~=[]
84                 for f = fn(:)'
85                     answ = answ & isempty(m(f))
86                     if ~answ
87                         break
88                     end
89                 end
90             end
91         else                    // other types of mlist
92             oname = "%" + typeof(m) + "_isempty"
93             if isdef(oname,"n")
94                 execstr("answ = "+oname+"(m)")
95                 return
96             end
97             answ = %f
98         end
99
100     else
101         if type(m)~=0
102             answ = size(m,"*")==0
103         else
104             answ = %t
105         end
106     end
107
108 endfunction