samer@3
|
1 % buffer - collect elements of sequence into sequence of arrays
|
samer@3
|
2 %
|
samer@3
|
3 % buffer ::
|
samer@3
|
4 % seq([Size:[[1,E]]]) ~'sequence of E dimensional arrays',
|
samer@3
|
5 % L:natural ~'buffer width',
|
samer@3
|
6 % E:natural ~'effective dimension of input values',
|
samer@3
|
7 % buffer_tailfn ~'function to deal with last incomplete buffer'
|
samer@3
|
8 % -> seq([[Size,L]]) ~'buffered sequence (no-overlapping)'.
|
samer@3
|
9 %
|
samer@3
|
10 % buffer_tailfn can be
|
samer@3
|
11 % seq.buffer.truncate :: void -> tailfn ~'discard incomplete buffer'.
|
samer@3
|
12 % seq.buffer.append :: void -> tailfn ~'append smaller buffer to sequence'.
|
samer@3
|
13 % seq.buffer.pad :: [[N]]-> tailfn ~'pad final buffer with value'.
|
samer@3
|
14
|
samer@3
|
15 classdef buffer < seq
|
samer@3
|
16 properties (GetAccess=private, SetAccess=immutable)
|
samer@3
|
17 width
|
samer@3
|
18 colons
|
samer@3
|
19 tailfn
|
samer@3
|
20 end
|
samer@3
|
21 properties (GetAccess=private, SetAccess=private)
|
samer@3
|
22 source
|
samer@3
|
23 buf
|
samer@3
|
24 end
|
samer@3
|
25 methods
|
samer@3
|
26 function a=buffer(source,L,dim,tailfn)
|
samer@3
|
27 sz=size1(source);
|
samer@3
|
28 if nargin<3, dim=length(sz); end
|
samer@3
|
29 if nargin<4, tailfn=seq.buffer.truncate; end
|
samer@3
|
30 colons = repmat({':'},1,dim);
|
samer@3
|
31 buf=repmat(head(source),tosize([ones(size(colons)),L]));
|
samer@3
|
32 source=next(source);
|
samer@3
|
33 for i=2:L
|
samer@3
|
34 if isempty(source), a=tailfn(buf,i-1,colons); return; end
|
samer@3
|
35 buf(colons{:},i)=head(source);
|
samer@3
|
36 source=next(source);
|
samer@3
|
37 end
|
samer@3
|
38 a.source = source;
|
samer@3
|
39 a.width = L;
|
samer@3
|
40 a.colons=colons;
|
samer@3
|
41 a.tailfn = tailfn;
|
samer@3
|
42 a.buf=buf;
|
samer@3
|
43 end
|
samer@3
|
44
|
samer@3
|
45 function z=elsize(a), z=size(a.buf); end
|
samer@3
|
46 function s=tostring(a), s=sprintf('%s >> buffer(%d,%d)',tostring(a.source),a.width,length(a.colons)+1); end
|
samer@3
|
47 function x=head(a), x=a.buf; end
|
samer@3
|
48 function a=next(a)
|
samer@3
|
49 % read next lot of values and make an array
|
samer@3
|
50 for i=1:a.width
|
samer@3
|
51 if isempty(a.source), a=a.tailfn(a.buf,i-1,a.colons); return; end
|
samer@3
|
52 a.buf(a.colons{:},i)=head(a.source);
|
samer@3
|
53 a.source=next(a.source);
|
samer@3
|
54 end
|
samer@3
|
55 end
|
samer@3
|
56 end
|
samer@3
|
57
|
samer@3
|
58 methods (Static)
|
samer@3
|
59 function f=truncate, f=@(buf,i,colons)[]; end
|
samer@3
|
60 function f=append, f=@(buf,i,colons)singleton(buf(colons{:},1:i)); end
|
samer@3
|
61 function f=pad(x), f=@padfn;
|
samer@3
|
62 function s=padfn(buf,i,colons)
|
samer@3
|
63 L=size(buf,length(colons)+1);
|
samer@3
|
64 buf(colons{:},i+1:L)=repmat(x,tosize([ones(size(colons)),L-i]));
|
samer@3
|
65 s=singleton(buf);
|
samer@3
|
66 end
|
samer@3
|
67 end
|
samer@3
|
68 end
|
samer@3
|
69 end
|
samer@3
|
70
|