Mercurial > hg > octave-nkf
diff scripts/general/fieldnames.m @ 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 | |
children | 921912c92102 |
line wrap: on
line diff
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{:}])); +