class Sequence::Circular
This Sequence
class is used to represent a circular buffer. You can think of this as having no beginning/end or the current location is always both at the beginning/end. Because of the circular nature, the methods scan_until, modify
, each
, collect!, and map! are not defined.
Attributes
pos[R]
def _adjust_delete(len=1,reverse=false)
pos = _pos(false) ret = nil @positions.each { |p| ret = p.__send__(:_deletion,pos,len,reverse,ret) }
end def _adjust_insert(len=1)
pos = _pos(false) ret = nil @positions.each { |p| ret = p.__send__(:_insertion,pos,len,ret) }
end
size[R]
def _adjust_delete(len=1,reverse=false)
pos = _pos(false) ret = nil @positions.each { |p| ret = p.__send__(:_deletion,pos,len,reverse,ret) }
end def _adjust_insert(len=1)
pos = _pos(false) ret = nil @positions.each { |p| ret = p.__send__(:_insertion,pos,len,ret) }
end
Public Class Methods
new(sequence,pos=sequence.pos)
click to toggle source
Create a circular sequence from a normal finite one.
# File lib/sequence/circular.rb, line 16 def initialize(sequence,pos=sequence.pos) @seq = sequence @pos=pos @size=sequence.size extend sequence.like @seq.on_change_notify self end
Public Instance Methods
<=>(other)
click to toggle source
Compare to other
.
# File lib/sequence/circular.rb, line 190 def <=>(other) position?(other) and pos<=>other.pos end
_normalize_pos(pos, size=nil)
click to toggle source
the default _parse_slice_args isn't forgiving enough about large (positive or negative) indexes
# File lib/sequence/circular.rb, line 27 def _normalize_pos pos, size=nil pos end
_pos=(pos)
click to toggle source
# File lib/sequence/circular.rb, line 52 def _pos=(pos) #pos=0 if pos>=size @pos=pos end
change_notification(cu,first,oldsize,newsize)
click to toggle source
# File lib/sequence/circular.rb, line 31 def change_notification(cu,first,oldsize,newsize) assert(cu.equal?( @seq )) @pos =_adjust_pos_on_change(@pos, first,oldsize,newsize) @size+=newsize-oldsize assert @size==@seq.size notify_change(self,first,oldsize,newsize) end
move!(reverse=false)
click to toggle source
skip over one pass of the data to return where you started
# File lib/sequence/circular.rb, line 184 def move!(reverse=false) size end
read!(reverse=false)
click to toggle source
def read1next v0 = @seq.read1next v0.nil? && @seq.move!(true) && (v0 = @seq.read1next) v0 end def read1prev v0 = @seq.read1prev v0.nil? && @seq.move!(false) && (v0 = @seq.read1prev) v0 end def read1after v0 = @seq.read1after v0.nil? && begin! && (v0 = @seq.read1after) v0 end def read1before v0 = @seq.read1before v0.nil? && @seq.move!(false) && (v0 = @seq.read1before) v0 end def skip1next @seq.skip1next || @seq.skip!(true) && @seq.skip1next end def skip1prev @seq.skip1prev || @seq.skip!(false) && @seq.skip1prev end def skip1after @seq.skip1after || @seq.skip!(true) && @seq.skip1after end def skip1before @seq.skip1before || @seq.skip!(false) && @seq.skip1before end def delete1after v0 = @seq.delete1after || @seq.skip!(true) && @seq.delete1after v0.nil? || @positions && _adjust_delete v0 end def delete1before v0 = @seq.delete1before || @seq.skip!(false) && @seq.delete1before v0.nil? || @positions && _adjust_delete v0 end def delete1after? v0 = @seq.delete1after? v0.nil? && @seq.skip!(true) && (v0 = @seq.delete1after?) v0.nil? || @positions && _adjust_delete v0 end def delete1before? v0 = @seq.delete1before? v0.nil? && @seq.skip!(false) && (v0 = @seq.delete1before?) v0.nil? || @positions && _adjust_delete v0 end def write1next(v) @seq.write1next(v) || @seq.skip!(true) && @seq.write1next(v) end def write1prev(v) @seq.write1prev(v) || @seq.skip!(false) && @seq.write1prev(v) end def write1after(v) @seq.write1after(v) || @seq.skip!(true) && @seq.write1after(v) end def write1before(v) @seq.write1before(v) || @seq.skip!(false) && @seq.write1before(v) end def write1next?(v) v0 = @seq.write1next?(v) v0.nil? && @seq.skip!(true) && (v0 = @seq.write1next?(v)) v0 end def write1prev?(v) v0 = @seq.write1prev?(v) v0.nil? && @seq.skip!(false) && (v0 = @seq.write1prev?(v)) v0 end def write1after?(v) v0 = @seq.write1after?(v) v0.nil? && @seq.skip!(true) && (v0 = @seq.write1after?(v)) v0 end def write1before?(v) v0 = @seq.write1before?(v) v0.nil? && @seq.skip!(false) && (v0 = @seq.write1before?(v)) v0 end def insert1before(v) @positions && _adjust_insert @seq.insert1before(v) end def insert1after(v) @positions && _adjust_insert @seq.insert1after(v) end def scan1next(v) v0 = read1next (v0.nil? || v==v0) ? v0 : (skip1prev;nil) end def scan1prev(v) v0 = read1prev (v0.nil? || v==v0) ? v0 : (skip1next;nil) end def modify1next(r) v0 = read1after (v0.nil? || (v = r[v0]).nil?) ? nil : (write1next!(v);v0) end def modify1prev(r) v0 = read1before (v0.nil? || (v = r[v0]).nil?) ? nil : (write1prev!(v);v0) end
# # read over one pass of the data to return where you started
# File lib/sequence/circular.rb, line 176 def read!(reverse=false) unless reverse read(size) else readback(-size) end end