%SHIFTARGIN Shift input arguments conditionally
%
%  ARGOUT = SHIFTARGIN(ARGIN,CONDITION,NPAR)
%
% INPUT
%   ARGIN      Cell array with function input arguments (VARARGIN)
%   CONDITION  Type of first argument, e.g. 'double','char','prmapping'.
%              'scalar' and 'vector' are allowed as well. See ISSCALAR.
%              'vector' holds only for numeric row vectors.
%              'integer' for integer doubles or INTX variables
%              This can also be a cell array of conditions. If one of them 
%              holds it is fulfilled.
%   NPAR       Number of parameter in ARGIN to be tested.
%
% OUTPUT
%   ARGOUT     If CONDITION is false ARGIN, else [{[]} ARGIN]
%
% SEE ALSO
% DATASETS, MAPPINGS

% Copyright: R.P.W. Duin, r.p.w.duin@37steps.com

function argout = shiftargin(argin,type,npar)

if nargin < 3, npar = 1; end
if (numel(argin) < npar) || ...
   (numel(argin) >= npar && isempty(argin{npar})) || ...
   (numel(argin) > npar && ismapping(argin{npar+1}))
  argout = argin;
  return
end

if nargin > 1
  if ~iscell(type)
    type = {type};
  end

  n = numel(type);
  shift = false;
  for j=1:n
    if islogical(type{j})
      shift = type{j};
    else
      switch type{j}
      case 'scalar'
        if isa(argin{npar},'numeric') && numel(argin{npar}) == 1
          shift = true;
        end
      case 'vector'
        if isa(argin{npar},'numeric') && size(argin{npar},1) == 1
          shift = true;
        end
      case 'integer'
        if isa(argin{npar},'double')
          shift = isequal(argin{npar},round(argin{npar}));
        end
      otherwise
        if isa(argin{npar},type{j})
          shift = true;
        end
      end
    end
    if shift, break; end
  end
else
  shift = true;
end


if shift
  argout = [{[]},argin];
else
  argout = argin;
end