changeset 15781:c33594eefda7

Add fieldnames.m which extensds fieldnames() to work on Java objects. Deprecate javafields. Rename old C++ fieldnames to __fieldnames__. * scripts/deprecated/javafields.m: Moved from scripts/java. Added deprecated warning. * scripts/java/javafields.m: Moved to scripts/deprecated. * scripts/general/fieldnames.m: New m-file which accepts Java, structure, or Octave objects as inputs. * libinterp/octave-value/ov-struct.cc(Ffieldnames): Renamed fieldnames to __fieldnames__ to avoid class with fieldnames.m. * scripts/deprecated/module.mk: Added javafields to deprecated build. * scripts/general/module.mk: Added fieldnames.m to build. * scripts/java/module.mk: Removed javafields.m from build.
author Rik <rik@octave.org>
date Thu, 13 Dec 2012 10:57:04 -0800
parents f25101b1e37f
children 10ed43563df5
files libinterp/octave-value/ov-struct.cc scripts/deprecated/javafields.m scripts/deprecated/module.mk scripts/general/fieldnames.m scripts/general/module.mk scripts/java/javafields.m scripts/java/module.mk
diffstat 7 files changed, 146 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-struct.cc	Thu Dec 13 10:47:24 2012 -0800
+++ b/libinterp/octave-value/ov-struct.cc	Thu Dec 13 10:57:04 2012 -0800
@@ -1925,49 +1925,33 @@
   return retval;
 }
 
-DEFUN (fieldnames, args, ,
+DEFUN (__fieldnames__, args, ,
   "-*- texinfo -*-\n\
-@deftypefn {Built-in Function} {} fieldnames (@var{struct})\n\
-Return a cell array of strings naming the elements of the structure\n\
-@var{struct}.  It is an error to call @code{fieldnames} with an\n\
-argument that is not a structure.\n\
+@deftypefn  {Built-in Function} {} __fieldnames__ (@var{struct})\n\
+@deftypefnx {Built-in Function} {} __fieldnames__ (@var{obj})\n\
+Internal function.\n\
+\n\
+Implements @code{fieldnames()} for structures and Octave objects.\n\
+@seealso{fieldnames}\n\
 @end deftypefn")
 {
   octave_value retval;
 
-  int nargin = args.length ();
-
-  if (nargin == 1)
-    {
-      octave_value arg = args(0);
-
-      if (arg.is_map () || arg.is_object ())
-        {
-          octave_map m = arg.map_value ();
-
-          string_vector keys = m.fieldnames ();
-
-          if (keys.length () == 0)
-            retval = Cell (0, 1);
-          else
-            retval = Cell (keys);
-        }
-      else
-        gripe_wrong_type_arg ("fieldnames", args(0));
-    }
+  // Input validation has already been done in fieldnames.m.
+  octave_value arg = args(0);
+
+  octave_map m = arg.map_value ();
+
+  string_vector keys = m.fieldnames ();
+
+  if (keys.length () == 0)
+    retval = Cell (0, 1);
   else
-    print_usage ();
+    retval = Cell (keys);
 
   return retval;
 }
 
-/*
-## test preservation of fieldname order
-%!test
-%! x(3).d=1;  x(2).a=2; x(1).b=3;  x(2).c=3;
-%! assert (fieldnames (x), {"d"; "a"; "b"; "c"});
-*/
-
 DEFUN (isfield, args, ,
   "-*- texinfo -*-\n\
 @deftypefn {Built-in Function} {} isfield (@var{x}, @var{name})\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/deprecated/javafields.m	Thu Dec 13 10:57:04 2012 -0800
@@ -0,0 +1,54 @@
+## Copyright (C) 2007 Michael Goffioul
+##
+## 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} {} javafields (@var{javaobj})
+## @deftypefnx {Function File} {} javafields ("@var{classname}")
+## @deftypefnx {Function File} {@var{fld_names} =} javafields (@dots{})
+## Return the fields of a Java object or Java class in the form of a cell 
+## array of strings.  If no output is requested, print the result
+## to the standard output.
+## @seealso{fieldnames, methods, javamethods, javaObject}
+## @end deftypefn
+
+function fld_names = javafields (javaobj)
+
+  persistent warned = false;
+  if (! warned)
+    warned = true;
+    warning ("Octave:deprecated-function",
+             "javafields is obsolete and will be removed from a future version of Octave, please use fieldnames instead");
+  endif
+  
+  if (nargin != 1)
+    print_usage ();
+  endif
+  
+  c_methods = java_invoke ("org.octave.ClassHelper", "getFields", javaobj);
+  method_list = strsplit (c_methods, ';');
+
+  if (nargout == 0)
+    if (! isempty (method_list))
+      disp (method_list);
+    endif
+  else
+    fld_names = cellstr (method_list);
+  endif
+
+endfunction
+
--- a/scripts/deprecated/module.mk	Thu Dec 13 10:47:24 2012 -0800
+++ b/scripts/deprecated/module.mk	Thu Dec 13 10:57:04 2012 -0800
@@ -7,6 +7,7 @@
   deprecated/cut.m \
   deprecated/error_text.m \
   deprecated/isstr.m \
+  deprecated/javafields.m \
   deprecated/java_get.m \
   deprecated/java_new.m \
   deprecated/java_set.m \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/general/fieldnames.m	Thu Dec 13 10:57:04 2012 -0800
@@ -0,0 +1,73 @@
+## Copyright (C) 2012 Rik Wehbring
+##
+## 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} {@var{names} =} fieldnames (@var{struct})
+## @deftypefnx {Function File} {@var{names} =} fieldnames (@var{obj})
+## @deftypefnx {Function File} {@var{names} =} fieldnames (@var{javaobj})
+## @deftypefnx {Function File} {@var{names} =} fieldnames ("@var{jclassname}")
+## Return a cell array of strings with the names of the fields in the
+## specified input.
+##
+## When the input is a structure @var{struct}, the names are the elements
+## of the structure.
+##
+## When the input is an Octave object @var{obj}, the names are the public
+## properties of the object.
+##
+## When the input is a Java object @var{javaobj} or Java classname
+## @var{jclassname}) the name are the public data elements of the object or
+## class.
+## @seealso{struct, methods}
+## @end deftypefn
+
+function names = fieldnames (obj)
+  
+  if (nargin != 1)
+    print_usage ();
+  endif
+  
+  if (isstruct (obj) || isobject (obj))
+    ## Call internal C++ function for structs or Octave objects
+    names = __fieldnames__ (obj);
+  elseif (isjava (obj) || ischar (obj))
+    names_str = java_invoke ("org.octave.ClassHelper", "getFields", obj);
+    names = strsplit (names_str, ';');
+  else
+    error ("fieldnames: Invalid input argument"); 
+  endif
+
+endfunction
+
+
+## test preservation of fieldname order
+%!test
+%! x(3).d=1;  x(2).a=2;  x(1).b=3;  x(2).c=3;
+%! assert (fieldnames (x), {"d"; "a"; "b"; "c"});
+
+## test empty structure
+%!test
+%! s = struct ();
+%! assert (fieldnames (s), cell (0, 1));
+
+## test Java classname
+%!testif HAVE_JAVA 
+%! names = fieldnames ("java.lang.Double");
+%! search = strfind (names, "java.lang.Double.MAX_VALUE");
+%! assert (! isempty ([search{:}]));
+
--- a/scripts/general/module.mk	Thu Dec 13 10:47:24 2012 -0800
+++ b/scripts/general/module.mk	Thu Dec 13 10:57:04 2012 -0800
@@ -28,6 +28,7 @@
   general/del2.m \
   general/display.m \
   general/divergence.m \
+  general/fieldnames.m \
   general/flipdim.m \
   general/fliplr.m \
   general/flipud.m \
--- a/scripts/java/javafields.m	Thu Dec 13 10:47:24 2012 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-## Copyright (C) 2007 Michael Goffioul
-##
-## 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} {} javafields (@var{javaobj})
-## @deftypefnx {Function File} {} javafields ("@var{classname}")
-## @deftypefnx {Function File} {@var{fld_names} =} javafields (@dots{})
-## Return the fields of a Java object or Java class in the form of a cell 
-## array of strings.  If no output is requested, print the result
-## to the standard output.
-## @seealso{javamethods, javaObject}
-## @end deftypefn
-
-function fld_names = javafields (javaobj)
-  
-  if (nargin != 1)
-    print_usage ();
-  endif
-  
-  c_methods = java_invoke ("org.octave.ClassHelper", "getFields", javaobj);
-  method_list = strsplit (c_methods, ';');
-
-  if (nargout == 0)
-    if (! isempty (method_list))
-      disp (method_list);
-    endif
-  else
-    fld_names = cellstr (method_list);
-  endif
-
-endfunction
-
--- a/scripts/java/module.mk	Thu Dec 13 10:47:24 2012 -0800
+++ b/scripts/java/module.mk	Thu Dec 13 10:57:04 2012 -0800
@@ -9,7 +9,6 @@
   java/javaArray.m \
   java/javaaddpath.m \
   java/javaclasspath.m \
-  java/javafields.m \
   java/javamem.m \
   java/javamethods.m \
   java/javarmpath.m \