Mercurial > hg > octave-lyh
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 | 6 files changed, 100 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-struct.cc +++ b/libinterp/octave-value/ov-struct.cc @@ -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\
rename from scripts/java/javafields.m rename to scripts/deprecated/javafields.m --- a/scripts/java/javafields.m +++ b/scripts/deprecated/javafields.m @@ -23,10 +23,17 @@ ## 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} +## @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 ();
--- a/scripts/deprecated/module.mk +++ b/scripts/deprecated/module.mk @@ -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 \
new file mode 100644 --- /dev/null +++ b/scripts/general/fieldnames.m @@ -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{:}])); +