7c5a2a13cb
BUG= http://dartbug.com/2252 R=lrn@google.com Review URL: https://codereview.chromium.org//68563004 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@30409 260f80e4-7a28-3924-810f-c04153c831b5
79 lines
2.1 KiB
Dart
79 lines
2.1 KiB
Dart
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
part of utf;
|
|
|
|
/**
|
|
* _ListRange in an internal type used to create a lightweight Interable on a
|
|
* range within a source list. DO NOT MODIFY the underlying list while
|
|
* iterating over it. The results of doing so are undefined.
|
|
*/
|
|
// TODO(floitsch): Consider removing the extend and switch to implements since
|
|
// that's cheaper to allocate.
|
|
class _ListRange extends IterableBase {
|
|
final List _source;
|
|
final int _offset;
|
|
final int _length;
|
|
|
|
_ListRange(source, [offset = 0, length]) :
|
|
this._source = source,
|
|
this._offset = offset,
|
|
this._length = (length == null ? source.length - offset : length) {
|
|
if (_offset < 0 || _offset > _source.length) {
|
|
throw new RangeError.value(_offset);
|
|
}
|
|
if (_length != null && (_length < 0)) {
|
|
throw new RangeError.value(_length);
|
|
}
|
|
if (_length + _offset > _source.length) {
|
|
throw new RangeError.value(_length + _offset);
|
|
}
|
|
}
|
|
|
|
_ListRangeIterator get iterator =>
|
|
new _ListRangeIteratorImpl(_source, _offset, _offset + _length);
|
|
|
|
int get length => _length;
|
|
}
|
|
|
|
/**
|
|
* The _ListRangeIterator provides more capabilities than a standard iterator,
|
|
* including the ability to get the current position, count remaining items,
|
|
* and move forward/backward within the iterator.
|
|
*/
|
|
abstract class _ListRangeIterator implements Iterator<int> {
|
|
bool moveNext();
|
|
int get current;
|
|
int get position;
|
|
void backup([by]);
|
|
int get remaining;
|
|
void skip([count]);
|
|
}
|
|
|
|
class _ListRangeIteratorImpl implements _ListRangeIterator {
|
|
final List<int> _source;
|
|
int _offset;
|
|
final int _end;
|
|
|
|
_ListRangeIteratorImpl(this._source, int offset, this._end)
|
|
: _offset = offset - 1;
|
|
|
|
int get current => _source[_offset];
|
|
|
|
bool moveNext() => ++_offset < _end;
|
|
|
|
int get position => _offset;
|
|
|
|
void backup([int by = 1]) {
|
|
_offset -= by;
|
|
}
|
|
|
|
int get remaining => _end - _offset - 1;
|
|
|
|
void skip([int count = 1]) {
|
|
_offset += count;
|
|
}
|
|
}
|
|
|