samer@36: % resizer - sequence with overridden reported element size samer@3: % samer@36: % resizer :: Size:[[1,E]], seq([_->A]) -> seq([Size->A]). samer@36: classdef resizer < seq samer@3: properties (GetAccess=private, SetAccess=private) samer@3: source samer@3: newsize samer@3: check samer@3: end samer@3: methods samer@36: function o=resizer(newsize,source,check) samer@3: if ~size_match(elsize(source),newsize), samer@36: error('seq.resizer: size mismatch'); samer@3: end samer@3: if nargin<3, check=0; end samer@3: o.source=source; samer@3: o.newsize=newsize; samer@3: o.check=check; samer@3: end samer@3: samer@3: function x=head(a), x=head(a.source); if a.check, size_check(a.newsize,size(x)); end; end samer@23: function d=next(d), d.source=next(d.source); if isempty(d.source), d=nil; end; end samer@3: function s=elsize(a), s=a.newsize; end samer@3: function s=tostring(a), s=tostring(a.source); end samer@3: end samer@3: end samer@3: samer@3: function b=size_match(s1,s2) samer@3: b=all((s1==s2) | isnan(s1) | isnan(s2)); samer@3: end samer@3: samer@3: function b=size_check(spec,size) samer@3: if ~all((spec==size) | isnan(spec)) samer@36: error('seq.resizer: element size does not match specification'); samer@3: end samer@3: end