samer@0: function u=construct(s,sizes_in) samer@0: samer@0: nin=nargin(s.base); samer@0: samer@0: u=construct(s.base,s.sizes_in(1:nin)); samer@0: u.sizes_out = [u.sizes_out]; % !!! this is wrong. need better type system samer@0: u.process = mkproc(u.process,nin,nargout(s.base)); samer@0: end samer@0: samer@0: function f=mkproc(g,nin,nout) samer@0: empty={{}}; samer@0: f=@proc; samer@0: if nin==1 && nout==1, f=@proc_11; samer@0: elseif nin==1 && nout==0, f=@proc_10; samer@0: else, f=@proc_nn; end samer@0: samer@0: function proc_10(x1), samer@0: if ~isempty(x1), g(x1{1}); end; samer@0: end samer@0: function y1=proc_11(x1,x), if isempty(x1), y1={}; else y1={g(x1{1})}; end; end samer@0: samer@0: function varargout=proc_nn(varargin) samer@0: if any(cellfun(@isempty,varargin)), varargout=repmat(empty,1,nout); samer@0: else samer@0: ins=cellfun(@unbox,varargin(1:nin)); samer@0: [outs{1:nout}]=g(ins{:}); samer@0: varargout=cellfun(@box,outs); samer@0: end samer@0: end samer@0: function x=unbox(y), x=y{1}; end samer@0: function y=box(x), y={x}; end samer@0: end samer@0: