view scripts/set/private/validsetargs.m @ 27229:255f2681d224

intersect.m: Accept a "legacy" flag for Matlab compatibility. * NEWS: Announce change. * intersect.m: Add new calling form and explanation of "legacy" option to docstring. Allow up to 4 inputs in input validation. Check for "legacy" in input options and set variable optlegacy. Only use two-input form of sort or sortrows when number of outputs of intersect function is greater than 1. After calculation, change orientation of outputs as required based on optlegacy. Add BIST tests to test output orientation and values. * validsetargs.m: Modify to accept a variable number of option arguments as last input (varargin). Use switch statement to validate possible options including accepting "legacy".
author Rik <rik@octave.org>
date Wed, 10 Jul 2019 17:32:52 -0700
parents 00f796120a6d
children 9f44123dc25b
line wrap: on
line source

## Copyright (C) 2000-2019 Paul Kienzle
## Copyright (C) 2009-2010 Jaroslav Hajek
##
## 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
## <https://www.gnu.org/licenses/>.

## Validate arguments for binary set operation.

function [x, y] = validsetargs (caller, x, y, varargin)

  isallowedarraytype = @(x) isnumeric (x) || ischar (x) || islogical (x);

  if (nargin == 3)
    icx = iscellstr (x);
    icy = iscellstr (y);
    if (icx || icy)
      if (icx && ischar (y))
        y = cellstr (y);
      elseif (icy && ischar (x))
        x = cellstr (x);
      elseif (icy && isempty (x))
        x = {};
      elseif (icx && isempty (y))
        y = {};
      elseif (! (icx && icy))
        error ("%s: cell array of strings cannot be combined with a nonstring value", caller);
      endif
    elseif (! (isallowedarraytype (x) && isallowedarraytype (y)))
      error ("%s: A and B must be arrays or cell arrays of strings", caller);
    endif
  elseif (nargin == 4)
    for arg = varargin
      switch (arg{1})
        case "legacy"
          ## Accepted option, do nothing.

        case "rows"
          if (iscell (x) || iscell (y))
            error ('%s: cells not supported with "rows"', caller);
          elseif (! (isallowedarraytype (x) && isallowedarraytype (y)))
            error ("%s: A and B must be arrays or cell arrays of strings", caller);
          else
            if (ndims (x) > 2 || ndims (y) > 2)
              error ('%s: A and B must be 2-dimensional matrices for "rows"', caller);
            elseif (columns (x) != columns (y) && ! (isempty (x) || isempty (y)))
              error ("%s: number of columns in A and B must match", caller);
            endif
          endif

        otherwise
          error ("%s: invalid option: %s", caller, byrows_arg);

      endswitch
    endfor
  endif

endfunction


## %!tests for function are in union.m