using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Antlr.Runtime.JavaExtensions { public class SubList : IList { IList _source; int _startIndex; int _endIndex; public SubList( IList source, int startIndex, int endIndex ) { if ( source == null ) throw new ArgumentNullException( "source" ); if ( startIndex < 0 || endIndex < 0 ) throw new ArgumentOutOfRangeException(); if ( startIndex > endIndex || endIndex >= source.Count ) throw new ArgumentException(); _source = source; _startIndex = startIndex; _endIndex = endIndex; } #region IList Members public int Add( object value ) { throw new NotSupportedException(); } public void Clear() { throw new NotSupportedException(); } public bool Contains( object value ) { return _source .Cast() .Skip( _startIndex ) .Take( _endIndex - _startIndex + 1 ) .Contains( value ); } public int IndexOf( object value ) { for ( int i = 0; i < Count; i++ ) { if ( object.Equals( this[i], value ) ) return i; } return -1; } public void Insert( int index, object value ) { throw new NotSupportedException(); } public bool IsFixedSize { get { return true; } } public bool IsReadOnly { get { return true; } } public void Remove( object value ) { throw new NotSupportedException(); } public void RemoveAt( int index ) { throw new NotSupportedException(); } public object this[int index] { get { if ( index < 0 || index >= Count ) throw new ArgumentOutOfRangeException(); return _source[index + _startIndex]; } set { if ( index < 0 || index >= Count ) throw new ArgumentOutOfRangeException(); _source[index + _startIndex] = value; } } #endregion #region ICollection Members public void CopyTo( Array array, int index ) { if ( array == null ) throw new ArgumentNullException( "array" ); if ( index < 0 ) throw new ArgumentOutOfRangeException(); if ( index + Count > array.Length ) throw new ArgumentException(); for ( int i = 0; i < Count; i++ ) { array.SetValue( this[i], index + i ); } } public int Count { get { return _endIndex - _startIndex + 1; } } public bool IsSynchronized { get { return false; } } public object SyncRoot { get { return _source.SyncRoot; } } #endregion #region IEnumerable Members public System.Collections.IEnumerator GetEnumerator() { return _source.Cast() .Skip( _startIndex ) .Take( _endIndex - _startIndex + 1 ) .GetEnumerator(); } #endregion } public class SubList : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable { IList _source; int _startIndex; int _endIndex; public SubList( IList source, int startIndex, int endIndex ) { if ( source == null ) throw new ArgumentNullException( "source" ); if ( startIndex < 0 || endIndex < 0 ) throw new ArgumentOutOfRangeException(); if ( startIndex > endIndex || endIndex >= source.Count ) throw new ArgumentException(); _source = source; _startIndex = startIndex; _endIndex = endIndex; } #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region ICollection Members void ICollection.CopyTo( Array array, int index ) { if ( array == null ) throw new ArgumentNullException( "array" ); if ( index < 0 ) throw new ArgumentOutOfRangeException(); if ( index + Count > array.Length ) throw new ArgumentException(); for ( int i = 0; i < Count; i++ ) { array.SetValue( this[i], index + i ); } } public int Count { get { return _endIndex - _startIndex + 1; } } public bool IsSynchronized { get { ICollection sourceCollection = _source as ICollection; if ( sourceCollection != null ) return sourceCollection.IsSynchronized; return false; } } public object SyncRoot { get { ICollection sourceCollection = _source as ICollection; if ( sourceCollection != null ) return sourceCollection.SyncRoot; return _source; } } #endregion #region IList Members int IList.Add( object value ) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } public bool Contains( object value ) { return _source.Cast().Skip( _startIndex ).Take( Count ).Contains( value ); } public int IndexOf( object value ) { for ( int i = _startIndex; i <= _endIndex; i++ ) { if ( object.Equals( _source[i], value ) ) return i - _startIndex; } return -1; } void IList.Insert( int index, object value ) { throw new NotSupportedException(); } public bool IsFixedSize { get { var sourceCollection = _source as IList; if ( sourceCollection != null ) return sourceCollection.IsFixedSize; return false; } } public bool IsReadOnly { get { return true; } } void IList.Remove( object value ) { throw new NotSupportedException(); } void IList.RemoveAt( int index ) { throw new NotSupportedException(); } object IList.this[int index] { get { return this[index]; } set { this[index] = (T)value; } } #endregion #region IEnumerable Members public IEnumerator GetEnumerator() { return _source.Skip( _startIndex ).Take( Count ).GetEnumerator(); } #endregion #region ICollection Members void ICollection.Add( T item ) { throw new NotSupportedException(); } void ICollection.Clear() { throw new NotSupportedException(); } public bool Contains( T item ) { return _source.Skip( _startIndex ).Take( Count ).Contains( item ); } public void CopyTo( T[] array, int arrayIndex ) { if ( array == null ) throw new ArgumentNullException( "array" ); if ( arrayIndex < 0 ) throw new ArgumentOutOfRangeException(); if ( arrayIndex + Count > array.Length ) throw new ArgumentException(); for ( int i = 0; i < Count; i++ ) { array[arrayIndex + i] = this[i]; } } bool ICollection.Remove( T item ) { throw new NotSupportedException(); } #endregion #region IList Members public int IndexOf( T item ) { for ( int i = 0; i < Count; i++ ) { if ( object.Equals( this[i], item ) ) return i; } return -1; } void IList.Insert( int index, T item ) { throw new NotSupportedException(); } void IList.RemoveAt( int index ) { throw new NotSupportedException(); } public T this[int index] { get { if ( index < 0 || index >= Count ) throw new ArgumentOutOfRangeException(); return _source[index + _startIndex]; } set { if ( index < 0 || index >= Count ) throw new ArgumentOutOfRangeException(); _source[index + _startIndex] = value; } } #endregion } }