changeset 18033:2627aeca5032

isa: allow cell array of class names as input, plus remove __isa_parent__(). * ov-class.cc (F__isa_parent__): removed function which was only used in isa.m and has now be removed. Replaced by new isa (implemented in C++). (Fisa): new function to replace isa.m and F__isa_parent__. Now supports a cell array of strings with classnames. While the m file implementation was kind of supporting this, it was doing so by accident and would not work when checking for parent class, integer, numeric, or float. * scripts/general/module.mk: remove isa.m from list of files. * scripts/general/isa.m: remove file. This function was really small and half of it (__isa_parent__) had to be implemented in C++ anyway. Implementing the whole thing in C++ means one less undocumented, meant as private, function. And any extra performance increase in a function called multiples times for input check is welcome.
author Carnë Draug <carandraug@octave.org>
date Fri, 29 Nov 2013 21:37:21 +0000
parents 9acd7b0f0639
children 132667955f66
files libinterp/octave-value/ov-class.cc scripts/general/isa.m scripts/general/module.mk
diffstat 3 files changed, 100 insertions(+), 131 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-class.cc	Tue Nov 26 02:05:50 2013 -0500
+++ b/libinterp/octave-value/ov-class.cc	Fri Nov 29 21:37:21 2013 +0000
@@ -2016,33 +2016,113 @@
 %!error class ()
 */
 
-DEFUN (__isa_parent__, args, ,
+DEFUN (isa, args, ,
        "-*- texinfo -*-\n\
-@deftypefn {Built-in Function} {} __isa_parent__ (@var{class}, @var{name})\n\
-Undocumented internal function.\n\
+@deftypefn {Function File} {} isa (@var{obj}, @var{classname})\n\
+Return true if @var{obj} is an object from the class @var{classname}.\n\
+\n\
+@var{classname} may also be one of the following class categories:\n\
+\n\
+@table @asis\n\
+@item @qcode{\"float\"}\n\
+Floating point value comprising classes @qcode{\"double\"} and\n\
+@qcode{\"single\"}.\n\
+\n\
+@item @qcode{\"integer\"}\n\
+Integer value comprising classes (u)int8, (u)int16, (u)int32, (u)int64.\n\
+\n\
+@item @qcode{\"numeric\"}\n\
+Numeric value comprising either a floating point or integer value.\n\
+@end table\n\
+\n\
+If @var{classname} is a cell array of string, a logical array of the same\n\
+size is returned, containing true for each class to which @var{obj}\n\
+belongs to.\n\
+\n\
+@seealso{class, typeinfo}\n\
 @end deftypefn")
 {
-  octave_value retval = false;
-
-  if (args.length () == 2)
+  octave_value retval;
+
+  if (args.length () != 2)
+    {
+      print_usage ();
+      return retval;
+    }
+
+  octave_value obj = args(0); // not const because of find_parent_class ()
+  const Array<std::string> cls = args(1).cellstr_value ();
+  if (error_state)
+    {
+      error ("isa: CLASSNAME must be a string or cell attay of strings");
+      return retval;
+    }
+
+  boolNDArray matches (cls.dims (), false);
+  const octave_idx_type n = cls.numel ();
+  for (octave_idx_type idx = 0; idx < n; idx++)
     {
-      octave_value cls = args(0);
-      octave_value nm = args(1);
-
-      if (! error_state)
-        {
-          if (cls.find_parent_class (nm.string_value ()))
-            retval = true;
-        }
-      else
-        error ("__isa_parent__: expecting arguments to be character strings");
+      const std::string cl = cls(idx);
+      if ((cl == "float"   && obj.is_float_type   ()) ||
+          (cl == "integer" && obj.is_integer_type ()) ||
+          (cl == "numeric" && obj.is_numeric_type ()) ||
+          obj.class_name () == cl || obj.find_parent_class (cl))
+        matches(idx) = true;
     }
-  else
-    print_usage ();
-
-  return retval;
+  return octave_value (matches);
 }
 
+/*
+%!assert (isa ("char", "float"), false)
+%!assert (isa (logical (1), "float"), false)
+%!assert (isa (double (13), "float"), true)
+%!assert (isa (single (13), "float"), true)
+%!assert (isa (int8 (13), "float"), false)
+%!assert (isa (int16 (13), "float"), false)
+%!assert (isa (int32 (13), "float"), false)
+%!assert (isa (int64 (13), "float"), false)
+%!assert (isa (uint8 (13), "float"), false)
+%!assert (isa (uint16 (13), "float"), false)
+%!assert (isa (uint32 (13), "float"), false)
+%!assert (isa (uint64 (13), "float"), false)
+%!assert (isa ("char", "numeric"), false)
+%!assert (isa (logical (1), "numeric"), false)
+%!assert (isa (double (13), "numeric"), true)
+%!assert (isa (single (13), "numeric"), true)
+%!assert (isa (int8 (13), "numeric"), true)
+%!assert (isa (int16 (13), "numeric"), true)
+%!assert (isa (int32 (13), "numeric"), true)
+%!assert (isa (int64 (13), "numeric"), true)
+%!assert (isa (uint8 (13), "numeric"), true)
+%!assert (isa (uint16 (13), "numeric"), true)
+%!assert (isa (uint32 (13), "numeric"), true)
+%!assert (isa (uint64 (13), "numeric"), true)
+%!assert (isa (uint8 (13), "integer"), true)
+%!assert (isa (double (13), "integer"), false)
+%!assert (isa (single (13), "integer"), false)
+%!assert (isa (single (13), {"integer", "float", "single"}), [false true true])
+
+%!assert (isa (double (13), "double"))
+%!assert (isa (single (13), "single"))
+%!assert (isa (int8 (13), "int8"))
+%!assert (isa (int16 (13), "int16"))
+%!assert (isa (int32 (13), "int32"))
+%!assert (isa (int64 (13), "int64"))
+%!assert (isa (uint8 (13), "uint8"))
+%!assert (isa (uint16 (13), "uint16"))
+%!assert (isa (uint32 (13), "uint32"))
+%!assert (isa (uint64 (13), "uint64"))
+%!assert (isa ("string", "char"))
+%!assert (isa (true, "logical"))
+%!assert (isa (false, "logical"))
+%!assert (isa ({1, 2}, "cell"))
+%!assert (isa ({1, 2}, {"numeric", "integer", "cell"}), [false false true])
+
+%!test
+%! a.b = 1;
+%! assert (isa (a, "struct"));
+*/
+
 DEFUN (__parent_classes__, args, ,
        "-*- texinfo -*-\n\
 @deftypefn {Built-in Function} {} __parent_classes__ (@var{x})\n\
--- a/scripts/general/isa.m	Tue Nov 26 02:05:50 2013 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-## Copyright (C) 2004-2013 John W. Eaton
-##
-## This file is part of Octave.
-##
-## Octave is free software; you can redistribute it and/or modify it
-## under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or (at
-## your option) any later version.
-##
-## Octave is distributed in the hope that it will be useful, but
-## WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-## General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with Octave; see the file COPYING.  If not, see
-## <http://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @deftypefn {Function File} {} isa (@var{obj}, @var{classname})
-## Return true if @var{obj} is an object from the class @var{classname}.
-##
-## @var{classname} may also be one of the following class categories: 
-##
-## @table @asis
-## @item @qcode{"float"}
-## Floating point value comprising classes @qcode{"double"} and
-## @qcode{"single"}.
-##
-## @item @qcode{"integer"}
-## Integer value comprising classes (u)int8, (u)int16, (u)int32, (u)int64.
-##
-## @item @qcode{"numeric"}
-## Numeric value comprising either a floating point or integer value.
-## @end table
-## @seealso{class, typeinfo}
-## @end deftypefn
-
-## Author: Paul Kienzle <pkienzle@users.sf.net>
-## Adapted-by: jwe
-
-function retval = isa (obj, classname)
-
-  if (nargin != 2)
-    print_usage ();
-  endif
-
-  if (strcmp (classname, "float"))
-    retval = isfloat (obj);
-  elseif (strcmp (classname, "integer"))
-    retval = isinteger (obj);
-  elseif (strcmp (classname, "numeric"))
-    retval = isnumeric (obj);
-  else
-    class_of_obj = class (obj);
-    retval = strcmp (class_of_obj, classname);
-    if (! retval && isobject (obj))
-      retval = __isa_parent__ (obj, classname);
-    endif
-  endif
-
-endfunction
-
-
-%!assert (isa ("char", "float"), false)
-%!assert (isa (logical (1), "float"), false)
-%!assert (isa (double (13), "float"), true)
-%!assert (isa (single (13), "float"), true)
-%!assert (isa (int8 (13), "float"), false)
-%!assert (isa (int16 (13), "float"), false)
-%!assert (isa (int32 (13), "float"), false)
-%!assert (isa (int64 (13), "float"), false)
-%!assert (isa (uint8 (13), "float"), false)
-%!assert (isa (uint16 (13), "float"), false)
-%!assert (isa (uint32 (13), "float"), false)
-%!assert (isa (uint64 (13), "float"), false)
-%!assert (isa ("char", "numeric"), false)
-%!assert (isa (logical (1), "numeric"), false)
-%!assert (isa (double (13), "numeric"), true)
-%!assert (isa (single (13), "numeric"), true)
-%!assert (isa (int8 (13), "numeric"), true)
-%!assert (isa (int16 (13), "numeric"), true)
-%!assert (isa (int32 (13), "numeric"), true)
-%!assert (isa (int64 (13), "numeric"), true)
-%!assert (isa (uint8 (13), "numeric"), true)
-%!assert (isa (uint16 (13), "numeric"), true)
-%!assert (isa (uint32 (13), "numeric"), true)
-%!assert (isa (uint64 (13), "numeric"), true)
-%!assert (isa (uint8 (13), "integer"), true)
-%!assert (isa (double (13), "integer"), false)
-%!assert (isa (single (13), "integer"), false)
-
-%!assert (isa (double (13), "double"))
-%!assert (isa (single (13), "single"))
-%!assert (isa (int8 (13), "int8"))
-%!assert (isa (int16 (13), "int16"))
-%!assert (isa (int32 (13), "int32"))
-%!assert (isa (int64 (13), "int64"))
-%!assert (isa (uint8 (13), "uint8"))
-%!assert (isa (uint16 (13), "uint16"))
-%!assert (isa (uint32 (13), "uint32"))
-%!assert (isa (uint64 (13), "uint64"))
-%!assert (isa ("string", "char"))
-%!assert (isa (true, "logical"))
-%!assert (isa (false, "logical"))
-%!assert (isa ({1, 2}, "cell"))
-%!test
-%! a.b = 1;
-%! assert (isa (a, "struct"));
-
--- a/scripts/general/module.mk	Tue Nov 26 02:05:50 2013 -0500
+++ b/scripts/general/module.mk	Fri Nov 29 21:37:21 2013 +0000
@@ -40,7 +40,6 @@
   general/interp3.m \
   general/interpn.m \
   general/interpft.m \
-  general/isa.m \
   general/iscolumn.m \
   general/isdir.m \
   general/isequal.m \