class Sequence::SubSeq

Attributes

data[R]
pos[R]
size[R]

Public Class Methods

new(seq, first,len) click to toggle source
# File lib/sequence/subseq.rb, line 8
def initialize(seq, first,len)
  assert first
  first+len-1>=seq.size and len=seq.size-first
  @data=seq
  @pos=0
  @first,@size=first,len
  extend seq.like

  #ask for notifications on the parent seq...
  @data.on_change_notify self
  assert @first
  #p [:init,__id__]
end

Public Instance Methods

_pos=(newp) click to toggle source
# File lib/sequence/subseq.rb, line 67
def _pos=newp
  @pos=newp
end
change_notification(data,first,oldsize,newsize) click to toggle source
# File lib/sequence/subseq.rb, line 22
def change_notification data,first,oldsize,newsize
  assert @data==data 
  old_first=@first
  old_size=@size
  @pos=(_adjust_pos_on_change @first+@pos,first,oldsize,newsize)-@first
  @size=(_adjust_pos_on_change @first+@size,first,oldsize,newsize)-@first
  @first=_adjust_pos_on_change @first,first,oldsize,newsize
  assert @first
  #p [:cn, __id__]
  
  notify_change(self, first-@first, oldsize, newsize)
end
closed?() click to toggle source
Calls superclass method Object#closed?
# File lib/sequence/subseq.rb, line 89
def closed?
  super or @data.closed?
end
eof?() click to toggle source
# File lib/sequence/subseq.rb, line 61
def eof?
  @pos>=@size
end
modify(*args) click to toggle source
# File lib/sequence/subseq.rb, line 81
def modify(*args)
  data=args.pop
  first,len,only1=_parse_slice_args( *args)
  first+=@first
  only1 ? @data.modify(first,data) : @data.modify(first,len,data)
end
offset() click to toggle source
# File lib/sequence/subseq.rb, line 35
def offset; @first end
read(len) click to toggle source
# File lib/sequence/subseq.rb, line 49
def read(len)
  result=readahead(len)
  move result.size
  result
end
readahead(len) click to toggle source
# File lib/sequence/subseq.rb, line 37
def readahead(len)
    eof? and return new_data
    len>rest=rest_size and len=rest
    @data[@pos+offset,len]
end
readback(len) click to toggle source
# File lib/sequence/subseq.rb, line 55
def readback(len)
  result=readbehind(len)
  move( -result.size )
  result
end
readbehind(len) click to toggle source
# File lib/sequence/subseq.rb, line 43
def readbehind(len)
  @pos.zero? and return new_data
  @pos>=len or len=@pos
  @data[@pos+offset-len,len] 
end
subseq(*args) click to toggle source
# File lib/sequence/subseq.rb, line 75
def subseq *args
  #p [:subseq, __id__]
  first,len,only1=_parse_slice_args( *args)
  SubSeq.new(@data,@first+first,len)
end