diff scripts/miscellaneous/getfield.m @ 19310:1fa328da03ef

Overhaul getfield, setfield, orderfields m-files. * ov-struct.cc (Fstruct): Add seealso link to isfield in docstring. * ov-struct.cc (Frmfield): Add seealso link to isfield in docstring. * ov-struct.cc (Fisfield): Add newline between first sentence description of function and remainder of docstring. * getfield.m: Redo docstring. Match function variable names to documentation names. Place input validation first in function. Add input validation BIST tests. * orderfields.m: Redo docstring. Clarify error() messages. Add additional error message if second argument is not of the required type. Return an empty struct of the same size as the empty struct input. Add input validation BIST tests. * setfield.m: Redo docstring. Match function variable names to documentation names. Place input validation first in function. Add input validation BIST tests.
author Rik <rik@octave.org>
date Tue, 21 Oct 2014 09:57:02 -0700
parents ea0d4dea1a17
children 4197fc428c7d
line wrap: on
line diff
--- a/scripts/miscellaneous/getfield.m	Tue Oct 21 09:39:03 2014 -0700
+++ b/scripts/miscellaneous/getfield.m	Tue Oct 21 09:57:02 2014 -0700
@@ -18,30 +18,38 @@
 ## <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn  {Function File} {[@var{val}] =} getfield (@var{s}, @var{field})
-## @deftypefnx {Function File} {[@var{val}] =} getfield (@var{s}, @var{idx1}, @var{field1}, @var{idx2}, @var{field2}, @dots{})
-## Extract a field from a structure (or a nested structure).  The syntax
-## is the same as @code{setfield}, except it omits the final @var{val}
-## argument, returning this value instead of setting it.
+## @deftypefn  {Function File} {@var{val} =} getfield (@var{s}, @var{field})
+## @deftypefnx {Function File} {@var{val} =} getfield (@var{s}, @var{sidx1}, @var{field1}, @var{fidx1}, @dots{})
+## Get the value of the field named @var{field} from a structure or nested
+## structure @var{s}.
 ##
-## @seealso{setfield, rmfield, isfield, fieldnames, isstruct, struct}
+## If @var{s} is a structure array then @var{sidx} selects an element of the
+## structure array, @var{field} specifies the field name of the selected
+## element, and @var{fidx} selects which element of the field (in the case of
+## an array or cell array).  See @code{setfield} for a more complete
+## description of the syntax.
+##
+## @seealso{setfield, rmfield, orderfields, isfield, fieldnames, isstruct, struct}
 ## @end deftypefn
 
 ## Author: Etienne Grossmann <etienne@cs.uky.edu>
 
-function obj = getfield (s, varargin)
+function val = getfield (s, varargin)
+
   if (nargin < 2)
     print_usage ();
   endif
+
   subs = varargin;
   flds = cellfun ("isclass", subs, "char");
   idxs = cellfun ("isclass", subs, "cell");
-  if (all (flds | idxs))
-    typs = merge (flds, {"."}, {"()"});
-    obj = subsref (s, struct ("type", typs, "subs", subs));
-  else
+  if (! all (flds | idxs))
     error ("getfield: invalid index");
   endif
+
+  typs = merge (flds, {"."}, {"()"});
+  val = subsref (s, struct ("type", typs, "subs", subs));
+
 endfunction
 
 
@@ -49,6 +57,11 @@
 %! x.a = "hello";
 %! assert (getfield (x, "a"), "hello");
 %!test
-%! ss(1,2).fd(3).b = 5;
-%! assert (getfield (ss,{1,2},"fd",{3},"b"), 5);
+%! ss(1,2).fd(3).b(1,4) = 5;
+%! assert (getfield (ss,{1,2},"fd",{3},"b", {1,4}), 5);
 
+%% Test input validation
+%!error getfield ()
+%!error getfield (1)
+%!error <invalid index> getfield (1,2)
+