function [buf] = buffer() buf = struct('mem', [], 'ri', 0, 'wi', 0, 'obj', @()obj_(), 'len', @()len_(), 'read', @(len)read_(len), 'readAt', @(len, offset)readAt_(len, offset), 'setReadIndex', @(offset)setReadIndex_(offset), 'write', @(x)write_(x)); function b = obj_() b = buf; end function len = len_() len = 0; if (buf.wi > buf.ri) len = buf.wi - buf.ri; end end function [x] = readAt_(len, offset) x = []; if (buf.ri+offset) >= 0 if (buf.wi-(buf.ri+offset) >= len) x = buf.mem(buf.ri+1+offset:buf.ri+len+offset); end end end function [x] = read_(len) x = readAt_(len, 0); if ~isempty(x) buf.ri = buf.ri + len; end end function setReadIndex_(offset) buf.ri = offset; end function write_(x) len = length(x); buf.mem(buf.wi+1:buf.wi+len, :) = x; buf.wi = buf.wi + len; end end