-#if NET_2_0
-/*\r
- Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft\r
- Permission is hereby granted, free of charge, to any person obtaining a copy\r
- of this software and associated documentation files (the "Software"), to deal\r
- in the Software without restriction, including without limitation the rights\r
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
- copies of the Software, and to permit persons to whom the Software is\r
- furnished to do so, subject to the following conditions:\r
- \r
- The above copyright notice and this permission notice shall be included in\r
- all copies or substantial portions of the Software.\r
- \r
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- SOFTWARE.\r
-*/\r
-\r
-using System;\r
-using System.Text;\r
-using System.Diagnostics;\r
-using SCG = System.Collections.Generic;\r
-namespace C5\r
-{\r
- /// <summary>\r
- /// An advanced interface to operations on an array. The array is viewed as an \r
- /// <see cref="T:C5.IList`1"/> of fixed size, and so all operations that would change the\r
- /// size of the array will be invalid (and throw <see cref="T:C5.FixedSizeCollectionException"/>\r
- /// </summary>\r
- /// <typeparam name="T"></typeparam>\r
- public class WrappedArray<T> : IList<T>\r
- {\r
- class InnerList : ArrayList<T>\r
- {\r
- internal InnerList(T[] array) { this.array = array; size = array.Length; }\r
- }\r
- ArrayList<T> innerlist;\r
- //TODO: remember a ref to the wrapped array in WrappedArray to save a little on indexing?\r
- WrappedArray<T> underlying;\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="wrappedarray"></param>\r
- public WrappedArray(T[] wrappedarray) { innerlist = new InnerList(wrappedarray); }\r
-\r
- //for views\r
- WrappedArray(ArrayList<T> arraylist, WrappedArray<T> underlying) { innerlist = arraylist; this.underlying = underlying; }\r
-\r
- #region IList<T> Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public T First { get { return innerlist.First; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public T Last { get { return innerlist.Last; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="index"></param>\r
- /// <returns></returns>\r
- public T this[int index]\r
- {\r
- get { return innerlist[index]; }\r
- set { innerlist[index] = value; }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="filter"></param>\r
- /// <returns></returns>\r
- public IList<T> FindAll(Fun<T, bool> filter) { return innerlist.FindAll(filter); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="V"></typeparam>\r
- /// <param name="mapper"></param>\r
- /// <returns></returns>\r
- public IList<V> Map<V>(Fun<T, V> mapper) { return innerlist.Map<V>(mapper); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="V"></typeparam>\r
- /// <param name="mapper"></param>\r
- /// <param name="equalityComparer"></param>\r
- /// <returns></returns>\r
- public IList<V> Map<V>(Fun<T, V> mapper, SCG.IEqualityComparer<V> equalityComparer) { return innerlist.Map<V>(mapper, equalityComparer); }\r
-\r
- /// <summary>\r
- /// ???? should we throw NotRelevantException\r
- /// </summary>\r
- /// <value></value>\r
- public bool FIFO\r
- {\r
- get { throw new FixedSizeCollectionException(); }\r
- set { throw new FixedSizeCollectionException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public virtual bool IsFixedSize\r
- {\r
- get { return true; }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="index"></param>\r
- /// <param name="item"></param>\r
- public void Insert(int index, T item)\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="pointer"></param>\r
- /// <param name="item"></param>\r
- public void Insert(IList<T> pointer, T item)\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- public void InsertFirst(T item)\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- public void InsertLast(T item)\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="U"></typeparam>\r
- /// <param name="i"></param>\r
- /// <param name="items"></param>\r
- public void InsertAll<U>(int i, System.Collections.Generic.IEnumerable<U> items) where U : T\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public T Remove()\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public T RemoveFirst()\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public T RemoveLast()\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="start"></param>\r
- /// <param name="count"></param>\r
- /// <returns></returns>\r
- public IList<T> View(int start, int count)\r
- {\r
- return new WrappedArray<T>((ArrayList<T>)innerlist.View(start, count), underlying ?? this);\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public IList<T> ViewOf(T item)\r
- {\r
- return new WrappedArray<T>((ArrayList<T>)innerlist.ViewOf(item), underlying ?? this);\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public IList<T> LastViewOf(T item)\r
- {\r
- return new WrappedArray<T>((ArrayList<T>)innerlist.LastViewOf(item), underlying ?? this);\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public IList<T> Underlying { get { return underlying; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public int Offset { get { return innerlist.Offset; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public bool IsValid { get { return innerlist.IsValid; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="offset"></param>\r
- /// <returns></returns>\r
- public IList<T> Slide(int offset) { return innerlist.Slide(offset); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="offset"></param>\r
- /// <param name="size"></param>\r
- /// <returns></returns>\r
- public IList<T> Slide(int offset, int size) { return innerlist.Slide(offset, size); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="offset"></param>\r
- /// <returns></returns>\r
- public bool TrySlide(int offset) { return innerlist.TrySlide(offset); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="offset"></param>\r
- /// <param name="size"></param>\r
- /// <returns></returns>\r
- public bool TrySlide(int offset, int size) { return innerlist.TrySlide(offset, size); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="otherView"></param>\r
- /// <returns></returns>\r
- public IList<T> Span(IList<T> otherView) { return innerlist.Span(((WrappedArray<T>)otherView).innerlist); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public void Reverse() { innerlist.Reverse(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public bool IsSorted() { return innerlist.IsSorted(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="comparer"></param>\r
- /// <returns></returns>\r
- public bool IsSorted(SCG.IComparer<T> comparer) { return innerlist.IsSorted(comparer); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public void Sort() { innerlist.Sort(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="comparer"></param>\r
- public void Sort(SCG.IComparer<T> comparer) { innerlist.Sort(comparer); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public void Shuffle() { innerlist.Shuffle(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="rnd"></param>\r
- public void Shuffle(Random rnd) { innerlist.Shuffle(rnd); }\r
-\r
- #endregion\r
-\r
- #region IIndexed<T> Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public Speed IndexingSpeed { get { return Speed.Constant; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="start"></param>\r
- /// <param name="count"></param>\r
- /// <returns></returns>\r
- public IDirectedCollectionValue<T> this[int start, int count] { get { return innerlist[start, count]; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public int IndexOf(T item) { return innerlist.IndexOf(item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public int LastIndexOf(T item) { return innerlist.LastIndexOf(item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <returns></returns>\r
- public int FindIndex(Fun<T, bool> predicate) { return innerlist.FindIndex(predicate); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <returns></returns>\r
- public int FindLastIndex(Fun<T, bool> predicate) { return innerlist.FindLastIndex(predicate); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="i"></param>\r
- /// <returns></returns>\r
- public T RemoveAt(int i) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="start"></param>\r
- /// <param name="count"></param>\r
- public void RemoveInterval(int start, int count) { throw new FixedSizeCollectionException(); }\r
-\r
- #endregion\r
-\r
- #region ISequenced<T> Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public int GetSequencedHashCode() { return innerlist.GetSequencedHashCode(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="that"></param>\r
- /// <returns></returns>\r
- public bool SequencedEquals(ISequenced<T> that) { return innerlist.SequencedEquals(that); }\r
-\r
- #endregion\r
-\r
- #region ICollection<T> Members\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public Speed ContainsSpeed { get { return Speed.Linear; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public int GetUnsequencedHashCode() { return innerlist.GetUnsequencedHashCode(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="that"></param>\r
- /// <returns></returns>\r
- public bool UnsequencedEquals(ICollection<T> that) { return innerlist.UnsequencedEquals(that); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Contains(T item) { return innerlist.Contains(item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public int ContainsCount(T item) { return innerlist.ContainsCount(item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public ICollectionValue<T> UniqueItems() { return innerlist.UniqueItems(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public ICollectionValue<KeyValuePair<T, int>> ItemMultiplicities() { return innerlist.ItemMultiplicities(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="U"></typeparam>\r
- /// <param name="items"></param>\r
- /// <returns></returns>\r
- public bool ContainsAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T\r
- { return innerlist.ContainsAll(items); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Find(ref T item) { return innerlist.Find(ref item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool FindOrAdd(ref T item) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Update(T item) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <param name="olditem"></param>\r
- /// <returns></returns>\r
- public bool Update(T item, out T olditem) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool UpdateOrAdd(T item) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <param name="olditem"></param>\r
- /// <returns></returns>\r
- public bool UpdateOrAdd(T item, out T olditem) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Remove(T item) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <param name="removeditem"></param>\r
- /// <returns></returns>\r
- public bool Remove(T item, out T removeditem) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- public void RemoveAllCopies(T item) { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="U"></typeparam>\r
- /// <param name="items"></param>\r
- public void RemoveAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public void Clear() { throw new FixedSizeCollectionException(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="U"></typeparam>\r
- /// <param name="items"></param>\r
- public void RetainAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }\r
-\r
- #endregion\r
-\r
- #region IExtensible<T> Members\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public object SyncRoot { get { return innerlist.SyncRoot; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public bool IsReadOnly { get { return true; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public bool AllowsDuplicates\r
- {\r
- get { return true; }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public SCG.IEqualityComparer<T> EqualityComparer { get { return innerlist.EqualityComparer; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public bool DuplicatesByCounting\r
- {\r
- get { return false; }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Add(T item)\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <typeparam name="U"></typeparam>\r
- /// <param name="items"></param>\r
- public void AddAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T\r
- {\r
- throw new FixedSizeCollectionException();\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public bool Check()\r
- {\r
- return innerlist.Check() && (underlying == null || underlying.innerlist == innerlist.Underlying);\r
- }\r
-\r
- #endregion\r
-\r
- #region ICollectionValue<T> Members\r
- /// <summary>\r
- /// No listeners may be installed\r
- /// </summary>\r
- /// <value>0</value>\r
- public virtual EventTypeEnum ListenableEvents { get { return 0; } }\r
-\r
- /// <summary>\r
- /// No listeners ever installed\r
- /// </summary>\r
- /// <value>0</value>\r
- public virtual EventTypeEnum ActiveEvents { get { return 0; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event CollectionChangedHandler<T> CollectionChanged\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event CollectionClearedHandler<T> CollectionCleared\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event ItemsAddedHandler<T> ItemsAdded\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event ItemInsertedHandler<T> ItemInserted\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event ItemsRemovedHandler<T> ItemsRemoved\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public event ItemRemovedAtHandler<T> ItemRemovedAt\r
- {\r
- add { throw new UnlistenableEventException(); }\r
- remove { throw new UnlistenableEventException(); }\r
- }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public bool IsEmpty { get { return innerlist.IsEmpty; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public int Count { get { return innerlist.Count; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public Speed CountSpeed { get { return innerlist.CountSpeed; } }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="array"></param>\r
- /// <param name="index"></param>\r
- public void CopyTo(T[] array, int index) { innerlist.CopyTo(array, index); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public T[] ToArray() { return innerlist.ToArray(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="action"></param>\r
- public void Apply(Act<T> action) { innerlist.Apply(action); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <returns></returns>\r
- public bool Exists(Fun<T, bool> predicate) { return innerlist.Exists(predicate); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool Find(Fun<T, bool> predicate, out T item) { return innerlist.Find(predicate, out item); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <returns></returns>\r
- public bool All(Fun<T, bool> predicate) { return innerlist.All(predicate); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public T Choose() { return innerlist.Choose(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="filter"></param>\r
- /// <returns></returns>\r
- public SCG.IEnumerable<T> Filter(Fun<T, bool> filter) { return innerlist.Filter(filter); }\r
-\r
- #endregion\r
-\r
- #region IEnumerable<T> Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public SCG.IEnumerator<T> GetEnumerator() { return innerlist.GetEnumerator(); }\r
- #endregion\r
-\r
- #region IShowable Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="stringbuilder"></param>\r
- /// <param name="rest"></param>\r
- /// <param name="formatProvider"></param>\r
- /// <returns></returns>\r
- public bool Show(StringBuilder stringbuilder, ref int rest, IFormatProvider formatProvider)\r
- { return innerlist.Show(stringbuilder, ref rest, formatProvider); }\r
-\r
- #endregion\r
-\r
- #region IFormattable Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public override string ToString() { return innerlist.ToString(); }\r
-\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="format"></param>\r
- /// <param name="formatProvider"></param>\r
- /// <returns></returns>\r
- public virtual string ToString(string format, IFormatProvider formatProvider) { return innerlist.ToString(format, formatProvider); }\r
-\r
- #endregion\r
-\r
- #region IDirectedCollectionValue<T> Members\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public IDirectedCollectionValue<T> Backwards() { return innerlist.Backwards(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <param name="predicate"></param>\r
- /// <param name="item"></param>\r
- /// <returns></returns>\r
- public bool FindLast(Fun<T, bool> predicate, out T item) { return innerlist.FindLast(predicate, out item); }\r
-\r
- #endregion\r
-\r
- #region IDirectedEnumerable<T> Members\r
-\r
- IDirectedEnumerable<T> IDirectedEnumerable<T>.Backwards() { return Backwards(); }\r
-\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- /// <value></value>\r
- public EnumerationDirection Direction { get { return EnumerationDirection.Forwards; } }\r
-\r
- #endregion\r
-\r
- #region IDisposable Members\r
-\r
- /// <summary>\r
- /// Dispose this if a view else operation is illegal \r
- /// </summary>\r
- /// <exception cref="FixedSizeCollectionException">If not a view</exception>\r
- public void Dispose()\r
- {\r
- if (underlying == null)\r
- throw new FixedSizeCollectionException();\r
- else\r
- innerlist.Dispose();\r
- }\r
-\r
- #endregion\r
-\r
- #region ICloneable Members\r
-\r
- /// <summary>\r
- /// Make a shallow copy of this WrappedArray.\r
- /// \r
- /// \r
- /// </summary>\r
- /// <returns></returns>\r
- public virtual object Clone()\r
- {\r
- return new WrappedArray<T>(innerlist.ToArray());\r
- }\r
-\r
- #endregion\r
-\r
-\r
-\r
- #region IEnumerable Members\r
-\r
- System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r
- {\r
- throw new Exception("The method or operation is not implemented.");\r
- }\r
-\r
- #endregion\r
- }\r
-}
-#endif
+/*
+ Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+using System;
+using System.Text;
+using System.Diagnostics;
+using SCG = System.Collections.Generic;
+namespace C5
+{
+ /// <summary>
+ /// An advanced interface to operations on an array. The array is viewed as an
+ /// <see cref="T:C5.IList`1"/> of fixed size, and so all operations that would change the
+ /// size of the array will be invalid (and throw <see cref="T:C5.FixedSizeCollectionException"/>
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ public class WrappedArray<T> : IList<T>, SCG.IList<T>
+ {
+ class InnerList : ArrayList<T>
+ {
+ internal InnerList(T[] array) { this.array = array; size = array.Length; }
+ }
+ ArrayList<T> innerlist;
+ //TODO: remember a ref to the wrapped array in WrappedArray to save a little on indexing?
+ WrappedArray<T> underlying;
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="wrappedarray"></param>
+ public WrappedArray(T[] wrappedarray) { innerlist = new InnerList(wrappedarray); }
+
+ //for views
+ WrappedArray(ArrayList<T> arraylist, WrappedArray<T> underlying) { innerlist = arraylist; this.underlying = underlying; }
+
+ #region IList<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public T First { get { return innerlist.First; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public T Last { get { return innerlist.Last; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
+ public T this[int index]
+ {
+ get { return innerlist[index]; }
+ set { innerlist[index] = value; }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="filter"></param>
+ /// <returns></returns>
+ public IList<T> FindAll(Fun<T, bool> filter) { return innerlist.FindAll(filter); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="V"></typeparam>
+ /// <param name="mapper"></param>
+ /// <returns></returns>
+ public IList<V> Map<V>(Fun<T, V> mapper) { return innerlist.Map<V>(mapper); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="V"></typeparam>
+ /// <param name="mapper"></param>
+ /// <param name="equalityComparer"></param>
+ /// <returns></returns>
+ public IList<V> Map<V>(Fun<T, V> mapper, SCG.IEqualityComparer<V> equalityComparer) { return innerlist.Map<V>(mapper, equalityComparer); }
+
+ /// <summary>
+ /// ???? should we throw NotRelevantException
+ /// </summary>
+ /// <value></value>
+ public bool FIFO
+ {
+ get { throw new FixedSizeCollectionException(); }
+ set { throw new FixedSizeCollectionException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public virtual bool IsFixedSize
+ {
+ get { return true; }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="item"></param>
+ public void Insert(int index, T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="pointer"></param>
+ /// <param name="item"></param>
+ public void Insert(IList<T> pointer, T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ public void InsertFirst(T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ public void InsertLast(T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="i"></param>
+ /// <param name="items"></param>
+ public void InsertAll<U>(int i, System.Collections.Generic.IEnumerable<U> items) where U : T
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public T Remove()
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public T RemoveFirst()
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public T RemoveLast()
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="start"></param>
+ /// <param name="count"></param>
+ /// <returns></returns>
+ public IList<T> View(int start, int count)
+ {
+ return new WrappedArray<T>((ArrayList<T>)innerlist.View(start, count), underlying ?? this);
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public IList<T> ViewOf(T item)
+ {
+ return new WrappedArray<T>((ArrayList<T>)innerlist.ViewOf(item), underlying ?? this);
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public IList<T> LastViewOf(T item)
+ {
+ return new WrappedArray<T>((ArrayList<T>)innerlist.LastViewOf(item), underlying ?? this);
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public IList<T> Underlying { get { return underlying; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public int Offset { get { return innerlist.Offset; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public bool IsValid { get { return innerlist.IsValid; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="offset"></param>
+ /// <returns></returns>
+ public IList<T> Slide(int offset) { return innerlist.Slide(offset); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="offset"></param>
+ /// <param name="size"></param>
+ /// <returns></returns>
+ public IList<T> Slide(int offset, int size) { return innerlist.Slide(offset, size); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="offset"></param>
+ /// <returns></returns>
+ public bool TrySlide(int offset) { return innerlist.TrySlide(offset); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="offset"></param>
+ /// <param name="size"></param>
+ /// <returns></returns>
+ public bool TrySlide(int offset, int size) { return innerlist.TrySlide(offset, size); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="otherView"></param>
+ /// <returns></returns>
+ public IList<T> Span(IList<T> otherView) { return innerlist.Span(((WrappedArray<T>)otherView).innerlist); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public void Reverse() { innerlist.Reverse(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public bool IsSorted() { return innerlist.IsSorted(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="comparer"></param>
+ /// <returns></returns>
+ public bool IsSorted(SCG.IComparer<T> comparer) { return innerlist.IsSorted(comparer); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public void Sort() { innerlist.Sort(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="comparer"></param>
+ public void Sort(SCG.IComparer<T> comparer) { innerlist.Sort(comparer); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public void Shuffle() { innerlist.Shuffle(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="rnd"></param>
+ public void Shuffle(Random rnd) { innerlist.Shuffle(rnd); }
+
+ #endregion
+
+ #region IIndexed<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public Speed IndexingSpeed { get { return Speed.Constant; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="start"></param>
+ /// <param name="count"></param>
+ /// <returns></returns>
+ public IDirectedCollectionValue<T> this[int start, int count] { get { return innerlist[start, count]; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int IndexOf(T item) { return innerlist.IndexOf(item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int LastIndexOf(T item) { return innerlist.LastIndexOf(item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <returns></returns>
+ public int FindIndex(Fun<T, bool> predicate) { return innerlist.FindIndex(predicate); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <returns></returns>
+ public int FindLastIndex(Fun<T, bool> predicate) { return innerlist.FindLastIndex(predicate); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="i"></param>
+ /// <returns></returns>
+ public T RemoveAt(int i) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="start"></param>
+ /// <param name="count"></param>
+ public void RemoveInterval(int start, int count) { throw new FixedSizeCollectionException(); }
+
+ #endregion
+
+ #region ISequenced<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public int GetSequencedHashCode() { return innerlist.GetSequencedHashCode(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="that"></param>
+ /// <returns></returns>
+ public bool SequencedEquals(ISequenced<T> that) { return innerlist.SequencedEquals(that); }
+
+ #endregion
+
+ #region ICollection<T> Members
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public Speed ContainsSpeed { get { return Speed.Linear; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public int GetUnsequencedHashCode() { return innerlist.GetUnsequencedHashCode(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="that"></param>
+ /// <returns></returns>
+ public bool UnsequencedEquals(ICollection<T> that) { return innerlist.UnsequencedEquals(that); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Contains(T item) { return innerlist.Contains(item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int ContainsCount(T item) { return innerlist.ContainsCount(item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public ICollectionValue<T> UniqueItems() { return innerlist.UniqueItems(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public ICollectionValue<KeyValuePair<T, int>> ItemMultiplicities() { return innerlist.ItemMultiplicities(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="items"></param>
+ /// <returns></returns>
+ public bool ContainsAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T
+ { return innerlist.ContainsAll(items); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Find(ref T item) { return innerlist.Find(ref item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool FindOrAdd(ref T item) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Update(T item) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <param name="olditem"></param>
+ /// <returns></returns>
+ public bool Update(T item, out T olditem) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool UpdateOrAdd(T item) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <param name="olditem"></param>
+ /// <returns></returns>
+ public bool UpdateOrAdd(T item, out T olditem) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Remove(T item) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <param name="removeditem"></param>
+ /// <returns></returns>
+ public bool Remove(T item, out T removeditem) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ public void RemoveAllCopies(T item) { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="items"></param>
+ public void RemoveAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public void Clear() { throw new FixedSizeCollectionException(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="items"></param>
+ public void RetainAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }
+
+ #endregion
+
+ #region IExtensible<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public bool IsReadOnly { get { return true; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public bool AllowsDuplicates
+ {
+ get { return true; }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public SCG.IEqualityComparer<T> EqualityComparer { get { return innerlist.EqualityComparer; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public bool DuplicatesByCounting
+ {
+ get { return false; }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Add(T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="items"></param>
+ public void AddAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public bool Check()
+ {
+ return innerlist.Check() && (underlying == null || underlying.innerlist == innerlist.Underlying);
+ }
+
+ #endregion
+
+ #region ICollectionValue<T> Members
+ /// <summary>
+ /// No listeners may be installed
+ /// </summary>
+ /// <value>0</value>
+ public virtual EventTypeEnum ListenableEvents { get { return 0; } }
+
+ /// <summary>
+ /// No listeners ever installed
+ /// </summary>
+ /// <value>0</value>
+ public virtual EventTypeEnum ActiveEvents { get { return 0; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event CollectionChangedHandler<T> CollectionChanged
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event CollectionClearedHandler<T> CollectionCleared
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event ItemsAddedHandler<T> ItemsAdded
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event ItemInsertedHandler<T> ItemInserted
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event ItemsRemovedHandler<T> ItemsRemoved
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public event ItemRemovedAtHandler<T> ItemRemovedAt
+ {
+ add { throw new UnlistenableEventException(); }
+ remove { throw new UnlistenableEventException(); }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public bool IsEmpty { get { return innerlist.IsEmpty; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public int Count { get { return innerlist.Count; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public Speed CountSpeed { get { return innerlist.CountSpeed; } }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="array"></param>
+ /// <param name="index"></param>
+ public void CopyTo(T[] array, int index) { innerlist.CopyTo(array, index); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public T[] ToArray() { return innerlist.ToArray(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="action"></param>
+ public void Apply(Act<T> action) { innerlist.Apply(action); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <returns></returns>
+ public bool Exists(Fun<T, bool> predicate) { return innerlist.Exists(predicate); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Find(Fun<T, bool> predicate, out T item) { return innerlist.Find(predicate, out item); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <returns></returns>
+ public bool All(Fun<T, bool> predicate) { return innerlist.All(predicate); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public T Choose() { return innerlist.Choose(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="filter"></param>
+ /// <returns></returns>
+ public SCG.IEnumerable<T> Filter(Fun<T, bool> filter) { return innerlist.Filter(filter); }
+
+ #endregion
+
+ #region IEnumerable<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public SCG.IEnumerator<T> GetEnumerator() { return innerlist.GetEnumerator(); }
+ #endregion
+
+ #region IShowable Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="stringbuilder"></param>
+ /// <param name="rest"></param>
+ /// <param name="formatProvider"></param>
+ /// <returns></returns>
+ public bool Show(StringBuilder stringbuilder, ref int rest, IFormatProvider formatProvider)
+ { return innerlist.Show(stringbuilder, ref rest, formatProvider); }
+
+ #endregion
+
+ #region IFormattable Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public override string ToString() { return innerlist.ToString(); }
+
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="format"></param>
+ /// <param name="formatProvider"></param>
+ /// <returns></returns>
+ public virtual string ToString(string format, IFormatProvider formatProvider) { return innerlist.ToString(format, formatProvider); }
+
+ #endregion
+
+ #region IDirectedCollectionValue<T> Members
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public IDirectedCollectionValue<T> Backwards() { return innerlist.Backwards(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="predicate"></param>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool FindLast(Fun<T, bool> predicate, out T item) { return innerlist.FindLast(predicate, out item); }
+
+ #endregion
+
+ #region IDirectedEnumerable<T> Members
+
+ IDirectedEnumerable<T> IDirectedEnumerable<T>.Backwards() { return Backwards(); }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <value></value>
+ public EnumerationDirection Direction { get { return EnumerationDirection.Forwards; } }
+
+ #endregion
+
+ #region IDisposable Members
+
+ /// <summary>
+ /// Dispose this if a view else operation is illegal
+ /// </summary>
+ /// <exception cref="FixedSizeCollectionException">If not a view</exception>
+ public void Dispose()
+ {
+ if (underlying == null)
+ throw new FixedSizeCollectionException();
+ else
+ innerlist.Dispose();
+ }
+
+ #endregion
+
+ #region ICloneable Members
+
+ /// <summary>
+ /// Make a shallow copy of this WrappedArray.
+ ///
+ ///
+ /// </summary>
+ /// <returns></returns>
+ public virtual object Clone()
+ {
+ return new WrappedArray<T>(innerlist.ToArray());
+ }
+
+ #endregion
+
+ #region System.Collections.Generic.IList<T> Members
+
+ void System.Collections.Generic.IList<T>.RemoveAt(int index)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ void System.Collections.Generic.ICollection<T>.Add(T item)
+ {
+ throw new FixedSizeCollectionException();
+ }
+
+ #endregion
+
+ #region System.Collections.ICollection Members
+
+ bool System.Collections.ICollection.IsSynchronized
+ {
+ get { return false; }
+ }
+
+ [Obsolete]
+ Object System.Collections.ICollection.SyncRoot
+ {
+ get { return ((System.Collections.IList)innerlist).SyncRoot; }
+ }
+
+ void System.Collections.ICollection.CopyTo(Array arr, int index)
+ {
+ if (index < 0 || index + Count > arr.Length)
+ throw new ArgumentOutOfRangeException();
+
+ foreach (T item in this)
+ arr.SetValue(item, index++);
+ }
+
+ #endregion
+
+ #region System.Collections.IList Members
+
+ Object System.Collections.IList.this[int index]
+ {
+ get { return this[index]; }
+ set { this[index] = (T)value; }
+ }
+
+ int System.Collections.IList.Add(Object o)
+ {
+ bool added = Add((T)o);
+ // What position to report if item not added? SC.IList.Add doesn't say
+ return added ? Count - 1 : -1;
+ }
+
+ bool System.Collections.IList.Contains(Object o)
+ {
+ return Contains((T)o);
+ }
+
+ int System.Collections.IList.IndexOf(Object o)
+ {
+ return Math.Max(-1, IndexOf((T)o));
+ }
+
+ void System.Collections.IList.Insert(int index, Object o)
+ {
+ Insert(index, (T)o);
+ }
+
+ void System.Collections.IList.Remove(Object o)
+ {
+ Remove((T)o);
+ }
+
+ void System.Collections.IList.RemoveAt(int index)
+ {
+ RemoveAt(index);
+ }
+
+ #endregion
+
+ #region IEnumerable Members
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ throw new Exception("The method or operation is not implemented.");
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file