core :: RopeBytes :: defaultinit
# Implementation of a `StringCharView` for `Concat` objects
private class RopeBytes
super StringByteView
redef type SELFTYPE: Concat
var cache: FlatString is noinit
var cache_start: Int = -1
var cache_end: Int = -1
redef fun [](i) do
assert i >= 0 and i < target._byte_length
var flps = _cache_start
if i >= flps and i <= _cache_end then
return _cache.bytes[i - flps]
end
var lf = get_leaf_at(i)
return lf.bytes[i - _cache_start]
end
fun get_leaf_at(pos: Int): FlatString do
var flps = _cache_start
if pos >= flps and pos <= _cache_end then
return _cache
end
var s: String = target
var st = pos
loop
if s isa FlatString then break
s = s.as(Concat)
var lft = s._left
var llen = lft.byte_length
if pos >= llen then
s = s._right
pos -= llen
else
s = lft
end
end
_cache_start = st - pos
_cache_end = st - pos + s.byte_length - 1
_cache = s
return s
end
redef fun iterator_from(i) do return new RopeByteIterator.from(target, i)
redef fun reverse_iterator_from(i) do return new RopeByteReverseIterator.from(target, i)
end
lib/core/text/ropes.nit:658,1--709,3