changeset 9850:85f6c386f2bb

implement built-in logical
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 23 Nov 2009 06:55:30 +0100
parents 87fd803c583b
children 1fac51c5f83f
files scripts/general/logical.m scripts/general/module.mk src/ov-bool-mat.cc
diffstat 3 files changed, 32 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/general/logical.m	Fri Nov 20 14:46:13 2009 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-## Copyright (C) 1996, 1997, 1998, 2000, 2005, 2006, 2007, 2008 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} {} logical (@var{arg})
-## Convert @var{arg} to a logical value.  For example,
-##
-## @example
-## logical ([-1, 0, 1])
-## @end example
-##
-## @noindent
-## is equivalent to
-##
-## @example
-## [-1, 0, 1] != 0
-## @end example
-## @end deftypefn
-
-## Author: jwe
-
-function y = logical (x)
-
-  if (nargin == 1)
-    if (islogical (x))
-      y = x;
-    elseif (isempty (x))
-      y = zeros (size (x), "logical");
-    elseif (isnumeric (x))
-      if (any (isnan (x(:))))
-	error ("invalid conversion from NaN to logical");
-      else
-	y = x != 0;
-      endif
-    else
-      error ("logical not defined for type `%s'", typeinfo (x));
-    endif
-  else
-    print_usage ();
-  endif
-
-endfunction
-
-%!assert (logical ([]), zeros ([0, 0], "logical"));
-%!assert (logical (zeros (2, 0)), zeros ([2, 0], "logical"));
-%!assert (logical (0), false);
-%!assert (logical (13), true);
-%!assert (logical (-13), true);
-%!assert (logical (int8 (13)), true);
-%!assert (logical (int8 (-13)), true);
-%!assert (logical ([-1, 0, 1, Inf]), [-1, 0, 1, Inf] != 0);
-%!error (logical ([-1, 0, 1, NaN, Inf]))
-%!error (logical (NaN))
--- a/scripts/general/module.mk	Fri Nov 20 14:46:13 2009 +0100
+++ b/scripts/general/module.mk	Mon Nov 23 06:55:30 2009 +0100
@@ -48,7 +48,6 @@
   general/issymmetric.m \
   general/isvector.m \
   general/loadobj.m \
-  general/logical.m \
   general/logspace.m \
   general/mod.m \
   general/nargchk.m \
--- a/src/ov-bool-mat.cc	Fri Nov 20 14:46:13 2009 +0100
+++ b/src/ov-bool-mat.cc	Mon Nov 23 06:55:30 2009 +0100
@@ -536,6 +536,38 @@
   return retval;
 }
 
+DEFUN (logical, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Built-in Function} {} logical (@var{x})\n\
+Convert @var{x} to logical type.\n\
+@seealso{double, single, char}\n\
+@end deftypefn")
+{
+  octave_value retval;
+
+  if (args.length () == 1)
+    {
+      octave_value arg = args(0);
+      if (arg.is_bool_type ())
+        retval = arg;
+      else if (arg.is_numeric_type ())
+        {
+          if (arg.is_sparse_type ())
+            retval = arg.sparse_bool_matrix_value ();
+          else if (arg.is_scalar_type ())
+            retval = arg.bool_value ();
+          else
+            retval = arg.bool_array_value ();
+        }
+      else
+        gripe_wrong_type_arg ("logical", arg);
+    }
+  else
+    print_usage ();
+
+  return retval;
+}
+
 /*
 ;;; Local Variables: ***
 ;;; mode: C++ ***