Property definitions

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