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{:}]));
+