view 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 source

## Copyright (C) 2000-2013 Etienne Grossmann
## Copyright (C) 2009 VZLU Prague
##
## 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{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}.
##
## 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 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))
    error ("getfield: invalid index");
  endif

  typs = merge (flds, {"."}, {"()"});
  val = subsref (s, struct ("type", typs, "subs", subs));

endfunction


%!test
%! x.a = "hello";
%! assert (getfield (x, "a"), "hello");
%!test
%! 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)