-- Copyright 1993-1998, by the Cecil Project -- Department of Computer Science and Engineering, University of Washington -- See the LICENSE file for license information. --DOC Stream views of indexed collections are fully positionable, but --DOC not insertable, extensible, or removable. (Stream views of arrays --DOC could be made extensible.) template representation indexed_stream_view[T] isa positionable_stream[T]; private field contents(@:indexed_stream_view[`T]):indexed[T]; private var field pos(@:indexed_stream_view[`T]):int := 0; method position(v@:indexed_stream_view[`T]):int { v.pos } method set_position(v@:indexed_stream_view[`T], p:int, off_end:&():void):void { if(p < 0 | { p > v.length }, off_end, { v.pos := p; }); } method peek_next(v@:indexed_stream_view[`T], at_end:&():T):T { fetch(v.contents, v.position, at_end) } method peek_prev(v@:indexed_stream_view[`T], at_start:&():T):T { fetch(v.contents, v.position.pred, at_start) } method length(v@:indexed_stream_view[`T]):int { v.contents.length } method view_stream(c@:indexed[`T]):positionable_stream[T] { concrete object isa indexed_stream_view[T] { contents := c } } -- also allow mutation template representation m_indexed_stream_view[T] isa m_positionable_stream[T], indexed_stream_view[T]; private field signature contents(m_indexed_stream_view[`T]):m_indexed[T]; method set_peek_next(v@:m_indexed_stream_view[`T], x:T):void { v.contents!v.position := x; } method set_peek_prev(v@:m_indexed_stream_view[`T], x:T):void { v.contents!v.position.pred := x; } method view_stream(c@:m_indexed[`T]):m_positionable_stream[T] { concrete object isa m_indexed_stream_view[T] { contents := c } }