samer@0: function u=construct(s,sizes_in) samer@0: u=mkunit(s); samer@0: fn=s.fn(sizes_in); samer@0: if isempty(s.sizefn) samer@0: u.sizes_out=guess_sizes(fn,sizes_in,nargout(s)); samer@0: else samer@0: u.sizes_out=s.sizefn(sizes_in); samer@0: end samer@0: u.process=mkproc(fn,nargin(s),nargout(s)); samer@0: samer@0: end samer@0: samer@0: function f=mkproc(fn,nin,nout); samer@0: if nout==0, f = @proc_n0; samer@0: elseif nin==0, f = @proc_0n; samer@0: elseif nin==1 && nout==1, f=@proc_11; samer@0: else f=@proc_nn; end samer@0: samer@0: function proc_n0(varargin), fn(varargin{1:nin}); end samer@0: function out=proc_11(in), out=fn(in); end samer@0: function varargout=proc_0n, [varargout{1:nout}]=fn(); end samer@0: function varargout=proc_nn(varargin), samer@0: [varargout{1:nout}]=fn(varargin{1:nin}); samer@0: end samer@0: end samer@0: samer@0: function sz_out=guess_sizes(fn,sz_in,nout) samer@0: ins = map(@zeros,sz_in); samer@0: [outs{1:nout}] = fn(ins{:}); samer@0: sz_out = map(@size,outs); samer@0: end samer@0: