samer@3: % buffer - collect elements of sequence into sequence of arrays samer@3: % samer@3: % buffer :: samer@3: % seq([Size:[[1,E]]]) ~'sequence of E dimensional arrays', samer@3: % L:natural ~'buffer width', samer@3: % E:natural ~'effective dimension of input values', samer@3: % buffer_tailfn ~'function to deal with last incomplete buffer' samer@3: % -> seq([[Size,L]]) ~'buffered sequence (no-overlapping)'. samer@3: % samer@3: % buffer_tailfn can be samer@3: % seq.buffer.truncate :: void -> tailfn ~'discard incomplete buffer'. samer@3: % seq.buffer.append :: void -> tailfn ~'append smaller buffer to sequence'. samer@3: % seq.buffer.pad :: [[N]]-> tailfn ~'pad final buffer with value'. samer@3: samer@3: classdef buffer < seq samer@3: properties (GetAccess=private, SetAccess=immutable) samer@3: width samer@3: colons samer@3: tailfn samer@3: end samer@3: properties (GetAccess=private, SetAccess=private) samer@3: source samer@3: buf samer@3: end samer@3: methods samer@3: function a=buffer(source,L,dim,tailfn) samer@3: sz=size1(source); samer@3: if nargin<3, dim=length(sz); end samer@3: if nargin<4, tailfn=seq.buffer.truncate; end samer@3: colons = repmat({':'},1,dim); samer@3: buf=repmat(head(source),tosize([ones(size(colons)),L])); samer@3: source=next(source); samer@3: for i=2:L samer@3: if isempty(source), a=tailfn(buf,i-1,colons); return; end samer@3: buf(colons{:},i)=head(source); samer@3: source=next(source); samer@3: end samer@3: a.source = source; samer@3: a.width = L; samer@3: a.colons=colons; samer@3: a.tailfn = tailfn; samer@3: a.buf=buf; samer@3: end samer@3: samer@3: function z=elsize(a), z=size(a.buf); end samer@3: function s=tostring(a), s=sprintf('%s >> buffer(%d,%d)',tostring(a.source),a.width,length(a.colons)+1); end samer@3: function x=head(a), x=a.buf; end samer@3: function a=next(a) samer@3: % read next lot of values and make an array samer@3: for i=1:a.width samer@3: if isempty(a.source), a=a.tailfn(a.buf,i-1,a.colons); return; end samer@3: a.buf(a.colons{:},i)=head(a.source); samer@3: a.source=next(a.source); samer@3: end samer@3: end samer@3: end samer@3: samer@3: methods (Static) samer@3: function f=truncate, f=@(buf,i,colons)[]; end samer@3: function f=append, f=@(buf,i,colons)singleton(buf(colons{:},1:i)); end samer@3: function f=pad(x), f=@padfn; samer@3: function s=padfn(buf,i,colons) samer@3: L=size(buf,length(colons)+1); samer@3: buf(colons{:},i+1:L)=repmat(x,tosize([ones(size(colons)),L-i])); samer@3: s=singleton(buf); samer@3: end samer@3: end samer@3: end samer@3: end samer@3: