Merge pull request #4198 from vkargov/vk-prevbb
[mono.git] / mcs / class / Mono.C5 / C5 / WrappedArray.cs
1 /*
2  Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
3  Permission is hereby granted, free of charge, to any person obtaining a copy
4  of this software and associated documentation files (the "Software"), to deal
5  in the Software without restriction, including without limitation the rights
6  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7  copies of the Software, and to permit persons to whom the Software is
8  furnished to do so, subject to the following conditions:
9  
10  The above copyright notice and this permission notice shall be included in
11  all copies or substantial portions of the Software.
12  
13  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19  SOFTWARE.
20 */
21
22 using System;
23 using System.Text;
24 using System.Diagnostics;
25 using SCG = System.Collections.Generic;
26 namespace C5
27 {
28   /// <summary>
29   /// An advanced interface to operations on an array. The array is viewed as an 
30   /// <see cref="T:C5.IList`1"/> of fixed size, and so all operations that would change the
31   /// size of the array will be invalid (and throw <see cref="T:C5.FixedSizeCollectionException"/>
32   /// </summary>
33   /// <typeparam name="T"></typeparam>
34   public class WrappedArray<T> : IList<T>, SCG.IList<T>
35   {
36     class InnerList : ArrayList<T>
37     {
38       internal InnerList(T[] array) { this.array = array; size = array.Length; }
39     }
40     ArrayList<T> innerlist;
41     //TODO: remember a ref to the wrapped array in WrappedArray to save a little on indexing?
42     WrappedArray<T> underlying;
43
44     /// <summary>
45     /// 
46     /// </summary>
47     /// <param name="wrappedarray"></param>
48     public WrappedArray(T[] wrappedarray) { innerlist = new InnerList(wrappedarray); }
49
50     //for views
51     WrappedArray(ArrayList<T> arraylist, WrappedArray<T> underlying) { innerlist = arraylist; this.underlying = underlying; }
52
53     #region IList<T> Members
54
55     /// <summary>
56     /// 
57     /// </summary>
58     /// <value></value>
59     public T First { get { return innerlist.First; } }
60
61     /// <summary>
62     /// 
63     /// </summary>
64     /// <value></value>
65     public T Last { get { return innerlist.Last; } }
66
67     /// <summary>
68     /// 
69     /// </summary>
70     /// <param name="index"></param>
71     /// <returns></returns>
72     public T this[int index]
73     {
74       get { return innerlist[index]; }
75       set { innerlist[index] = value; }
76     }
77
78     /// <summary>
79     /// 
80     /// </summary>
81     /// <param name="filter"></param>
82     /// <returns></returns>
83     public IList<T> FindAll(Fun<T, bool> filter) { return innerlist.FindAll(filter); }
84
85     /// <summary>
86     /// 
87     /// </summary>
88     /// <typeparam name="V"></typeparam>
89     /// <param name="mapper"></param>
90     /// <returns></returns>
91     public IList<V> Map<V>(Fun<T, V> mapper) { return innerlist.Map<V>(mapper); }
92
93     /// <summary>
94     /// 
95     /// </summary>
96     /// <typeparam name="V"></typeparam>
97     /// <param name="mapper"></param>
98     /// <param name="equalityComparer"></param>
99     /// <returns></returns>
100     public IList<V> Map<V>(Fun<T, V> mapper, SCG.IEqualityComparer<V> equalityComparer) { return innerlist.Map<V>(mapper, equalityComparer); }
101
102     /// <summary>
103     /// ???? should we throw NotRelevantException
104     /// </summary>
105     /// <value></value>
106     public bool FIFO
107     {
108       get { throw new FixedSizeCollectionException(); }
109       set { throw new FixedSizeCollectionException(); }
110     }
111
112     /// <summary>
113     /// 
114     /// </summary>
115     public virtual bool IsFixedSize
116     {
117       get { return true; }
118     }
119
120     /// <summary>
121     /// 
122     /// </summary>
123     /// <param name="index"></param>
124     /// <param name="item"></param>
125     public void Insert(int index, T item)
126     {
127       throw new FixedSizeCollectionException();
128     }
129
130     /// <summary>
131     /// 
132     /// </summary>
133     /// <param name="pointer"></param>
134     /// <param name="item"></param>
135     public void Insert(IList<T> pointer, T item)
136     {
137       throw new FixedSizeCollectionException();
138     }
139
140     /// <summary>
141     /// 
142     /// </summary>
143     /// <param name="item"></param>
144     public void InsertFirst(T item)
145     {
146       throw new FixedSizeCollectionException();
147     }
148
149     /// <summary>
150     /// 
151     /// </summary>
152     /// <param name="item"></param>
153     public void InsertLast(T item)
154     {
155       throw new FixedSizeCollectionException();
156     }
157
158     /// <summary>
159     /// 
160     /// </summary>
161     /// <typeparam name="U"></typeparam>
162     /// <param name="i"></param>
163     /// <param name="items"></param>
164     public void InsertAll<U>(int i, System.Collections.Generic.IEnumerable<U> items) where U : T
165     {
166       throw new FixedSizeCollectionException();
167     }
168
169     /// <summary>
170     /// 
171     /// </summary>
172     /// <returns></returns>
173     public T Remove()
174     {
175       throw new FixedSizeCollectionException();
176     }
177
178     /// <summary>
179     /// 
180     /// </summary>
181     /// <returns></returns>
182     public T RemoveFirst()
183     {
184       throw new FixedSizeCollectionException();
185     }
186
187     /// <summary>
188     /// 
189     /// </summary>
190     /// <returns></returns>
191     public T RemoveLast()
192     {
193       throw new FixedSizeCollectionException();
194     }
195
196     /// <summary>
197     /// 
198     /// </summary>
199     /// <param name="start"></param>
200     /// <param name="count"></param>
201     /// <returns></returns>
202     public IList<T> View(int start, int count)
203     {
204       return new WrappedArray<T>((ArrayList<T>)innerlist.View(start, count), underlying ?? this);
205     }
206
207     /// <summary>
208     /// 
209     /// </summary>
210     /// <param name="item"></param>
211     /// <returns></returns>
212     public IList<T> ViewOf(T item)
213     {
214       return new WrappedArray<T>((ArrayList<T>)innerlist.ViewOf(item), underlying ?? this);
215     }
216
217     /// <summary>
218     /// 
219     /// </summary>
220     /// <param name="item"></param>
221     /// <returns></returns>
222     public IList<T> LastViewOf(T item)
223     {
224       return new WrappedArray<T>((ArrayList<T>)innerlist.LastViewOf(item), underlying ?? this);
225     }
226
227     /// <summary>
228     /// 
229     /// </summary>
230     /// <value></value>
231     public IList<T> Underlying { get { return underlying; } }
232
233     /// <summary>
234     /// 
235     /// </summary>
236     /// <value></value>
237     public int Offset { get { return innerlist.Offset; } }
238
239     /// <summary>
240     /// 
241     /// </summary>
242     /// <value></value>
243     public bool IsValid { get { return innerlist.IsValid; } }
244
245     /// <summary>
246     /// 
247     /// </summary>
248     /// <param name="offset"></param>
249     /// <returns></returns>
250     public IList<T> Slide(int offset) { return innerlist.Slide(offset); }
251
252     /// <summary>
253     /// 
254     /// </summary>
255     /// <param name="offset"></param>
256     /// <param name="size"></param>
257     /// <returns></returns>
258     public IList<T> Slide(int offset, int size) { return innerlist.Slide(offset, size); }
259
260     /// <summary>
261     /// 
262     /// </summary>
263     /// <param name="offset"></param>
264     /// <returns></returns>
265     public bool TrySlide(int offset) { return innerlist.TrySlide(offset); }
266
267     /// <summary>
268     /// 
269     /// </summary>
270     /// <param name="offset"></param>
271     /// <param name="size"></param>
272     /// <returns></returns>
273     public bool TrySlide(int offset, int size) { return innerlist.TrySlide(offset, size); }
274
275     /// <summary>
276     /// 
277     /// </summary>
278     /// <param name="otherView"></param>
279     /// <returns></returns>
280     public IList<T> Span(IList<T> otherView) { return innerlist.Span(((WrappedArray<T>)otherView).innerlist); }
281
282     /// <summary>
283     /// 
284     /// </summary>
285     public void Reverse() { innerlist.Reverse(); }
286
287     /// <summary>
288     /// 
289     /// </summary>
290     /// <returns></returns>
291     public bool IsSorted() { return innerlist.IsSorted(); }
292
293     /// <summary>
294     /// 
295     /// </summary>
296     /// <param name="comparer"></param>
297     /// <returns></returns>
298     public bool IsSorted(SCG.IComparer<T> comparer) { return innerlist.IsSorted(comparer); }
299
300     /// <summary>
301     /// 
302     /// </summary>
303     public void Sort() { innerlist.Sort(); }
304
305     /// <summary>
306     /// 
307     /// </summary>
308     /// <param name="comparer"></param>
309     public void Sort(SCG.IComparer<T> comparer) { innerlist.Sort(comparer); }
310
311     /// <summary>
312     /// 
313     /// </summary>
314     public void Shuffle() { innerlist.Shuffle(); }
315
316     /// <summary>
317     /// 
318     /// </summary>
319     /// <param name="rnd"></param>
320     public void Shuffle(Random rnd) { innerlist.Shuffle(rnd); }
321
322     #endregion
323
324     #region IIndexed<T> Members
325
326     /// <summary>
327     /// 
328     /// </summary>
329     /// <value></value>
330     public Speed IndexingSpeed { get { return Speed.Constant; } }
331
332     /// <summary>
333     /// 
334     /// </summary>
335     /// <param name="start"></param>
336     /// <param name="count"></param>
337     /// <returns></returns>
338     public IDirectedCollectionValue<T> this[int start, int count] { get { return innerlist[start, count]; } }
339
340     /// <summary>
341     /// 
342     /// </summary>
343     /// <param name="item"></param>
344     /// <returns></returns>
345     public int IndexOf(T item) { return innerlist.IndexOf(item); }
346
347     /// <summary>
348     /// 
349     /// </summary>
350     /// <param name="item"></param>
351     /// <returns></returns>
352     public int LastIndexOf(T item) { return innerlist.LastIndexOf(item); }
353
354     /// <summary>
355     /// 
356     /// </summary>
357     /// <param name="predicate"></param>
358     /// <returns></returns>
359     public int FindIndex(Fun<T, bool> predicate) { return innerlist.FindIndex(predicate); }
360
361     /// <summary>
362     /// 
363     /// </summary>
364     /// <param name="predicate"></param>
365     /// <returns></returns>
366     public int FindLastIndex(Fun<T, bool> predicate) { return innerlist.FindLastIndex(predicate); }
367
368     /// <summary>
369     /// 
370     /// </summary>
371     /// <param name="i"></param>
372     /// <returns></returns>
373     public T RemoveAt(int i) { throw new FixedSizeCollectionException(); }
374
375     /// <summary>
376     /// 
377     /// </summary>
378     /// <param name="start"></param>
379     /// <param name="count"></param>
380     public void RemoveInterval(int start, int count) { throw new FixedSizeCollectionException(); }
381
382     #endregion
383
384     #region ISequenced<T> Members
385
386     /// <summary>
387     /// 
388     /// </summary>
389     /// <returns></returns>
390     public int GetSequencedHashCode() { return innerlist.GetSequencedHashCode(); }
391
392     /// <summary>
393     /// 
394     /// </summary>
395     /// <param name="that"></param>
396     /// <returns></returns>
397     public bool SequencedEquals(ISequenced<T> that) { return innerlist.SequencedEquals(that); }
398
399     #endregion
400
401     #region ICollection<T> Members
402     /// <summary>
403     /// 
404     /// </summary>
405     /// <value></value>
406     public Speed ContainsSpeed { get { return Speed.Linear; } }
407
408     /// <summary>
409     /// 
410     /// </summary>
411     /// <returns></returns>
412     public int GetUnsequencedHashCode() { return innerlist.GetUnsequencedHashCode(); }
413
414     /// <summary>
415     /// 
416     /// </summary>
417     /// <param name="that"></param>
418     /// <returns></returns>
419     public bool UnsequencedEquals(ICollection<T> that) { return innerlist.UnsequencedEquals(that); }
420
421     /// <summary>
422     /// 
423     /// </summary>
424     /// <param name="item"></param>
425     /// <returns></returns>
426     public bool Contains(T item) { return innerlist.Contains(item); }
427
428     /// <summary>
429     /// 
430     /// </summary>
431     /// <param name="item"></param>
432     /// <returns></returns>
433     public int ContainsCount(T item) { return innerlist.ContainsCount(item); }
434
435     /// <summary>
436     /// 
437     /// </summary>
438     /// <returns></returns>
439     public ICollectionValue<T> UniqueItems() { return innerlist.UniqueItems(); }
440
441     /// <summary>
442     /// 
443     /// </summary>
444     /// <returns></returns>
445     public ICollectionValue<KeyValuePair<T, int>> ItemMultiplicities() { return innerlist.ItemMultiplicities(); }
446
447     /// <summary>
448     /// 
449     /// </summary>
450     /// <typeparam name="U"></typeparam>
451     /// <param name="items"></param>
452     /// <returns></returns>
453     public bool ContainsAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T
454     { return innerlist.ContainsAll(items); }
455
456     /// <summary>
457     /// 
458     /// </summary>
459     /// <param name="item"></param>
460     /// <returns></returns>
461     public bool Find(ref T item) { return innerlist.Find(ref item); }
462
463     /// <summary>
464     /// 
465     /// </summary>
466     /// <param name="item"></param>
467     /// <returns></returns>
468     public bool FindOrAdd(ref T item) { throw new FixedSizeCollectionException(); }
469
470     /// <summary>
471     /// 
472     /// </summary>
473     /// <param name="item"></param>
474     /// <returns></returns>
475     public bool Update(T item) { throw new FixedSizeCollectionException(); }
476
477     /// <summary>
478     /// 
479     /// </summary>
480     /// <param name="item"></param>
481     /// <param name="olditem"></param>
482     /// <returns></returns>
483     public bool Update(T item, out T olditem) { throw new FixedSizeCollectionException(); }
484
485     /// <summary>
486     /// 
487     /// </summary>
488     /// <param name="item"></param>
489     /// <returns></returns>
490     public bool UpdateOrAdd(T item) { throw new FixedSizeCollectionException(); }
491
492     /// <summary>
493     /// 
494     /// </summary>
495     /// <param name="item"></param>
496     /// <param name="olditem"></param>
497     /// <returns></returns>
498     public bool UpdateOrAdd(T item, out T olditem) { throw new FixedSizeCollectionException(); }
499
500     /// <summary>
501     /// 
502     /// </summary>
503     /// <param name="item"></param>
504     /// <returns></returns>
505     public bool Remove(T item) { throw new FixedSizeCollectionException(); }
506
507     /// <summary>
508     /// 
509     /// </summary>
510     /// <param name="item"></param>
511     /// <param name="removeditem"></param>
512     /// <returns></returns>
513     public bool Remove(T item, out T removeditem) { throw new FixedSizeCollectionException(); }
514
515     /// <summary>
516     /// 
517     /// </summary>
518     /// <param name="item"></param>
519     public void RemoveAllCopies(T item) { throw new FixedSizeCollectionException(); }
520
521     /// <summary>
522     /// 
523     /// </summary>
524     /// <typeparam name="U"></typeparam>
525     /// <param name="items"></param>
526     public void RemoveAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }
527
528     /// <summary>
529     /// 
530     /// </summary>
531     public void Clear() { throw new FixedSizeCollectionException(); }
532
533     /// <summary>
534     /// 
535     /// </summary>
536     /// <typeparam name="U"></typeparam>
537     /// <param name="items"></param>
538     public void RetainAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T { throw new FixedSizeCollectionException(); }
539
540     #endregion
541
542     #region IExtensible<T> Members
543
544     /// <summary>
545     /// 
546     /// </summary>
547     /// <value></value>
548     public bool IsReadOnly { get { return true; } }
549
550     /// <summary>
551     /// 
552     /// </summary>
553     /// <value></value>
554     public bool AllowsDuplicates
555     {
556       get { return true; }
557     }
558
559     /// <summary>
560     /// 
561     /// </summary>
562     /// <value></value>
563     public SCG.IEqualityComparer<T> EqualityComparer { get { return innerlist.EqualityComparer; } }
564
565     /// <summary>
566     /// 
567     /// </summary>
568     /// <value></value>
569     public bool DuplicatesByCounting
570     {
571       get { return false; }
572     }
573
574     /// <summary>
575     /// 
576     /// </summary>
577     /// <param name="item"></param>
578     /// <returns></returns>
579     public bool Add(T item)
580     {
581       throw new FixedSizeCollectionException();
582     }
583
584     /// <summary>
585     /// 
586     /// </summary>
587     /// <typeparam name="U"></typeparam>
588     /// <param name="items"></param>
589     public void AddAll<U>(System.Collections.Generic.IEnumerable<U> items) where U : T
590     {
591       throw new FixedSizeCollectionException();
592     }
593
594     /// <summary>
595     /// 
596     /// </summary>
597     /// <returns></returns>
598     public bool Check()
599     {
600       return innerlist.Check() && (underlying == null || underlying.innerlist == innerlist.Underlying);
601     }
602
603     #endregion
604
605     #region ICollectionValue<T> Members
606     /// <summary>
607     /// No listeners may be installed
608     /// </summary>
609     /// <value>0</value>
610     public virtual EventTypeEnum ListenableEvents { get { return 0; } }
611
612     /// <summary>
613     /// No listeners ever installed
614     /// </summary>
615     /// <value>0</value>
616     public virtual EventTypeEnum ActiveEvents { get { return 0; } }
617
618     /// <summary>
619     /// 
620     /// </summary>
621     /// <value></value>
622     public event CollectionChangedHandler<T> CollectionChanged
623     {
624       add { throw new UnlistenableEventException(); }
625       remove { throw new UnlistenableEventException(); }
626     }
627
628     /// <summary>
629     /// 
630     /// </summary>
631     /// <value></value>
632     public event CollectionClearedHandler<T> CollectionCleared
633     {
634       add { throw new UnlistenableEventException(); }
635       remove { throw new UnlistenableEventException(); }
636     }
637
638     /// <summary>
639     /// 
640     /// </summary>
641     /// <value></value>
642     public event ItemsAddedHandler<T> ItemsAdded
643     {
644       add { throw new UnlistenableEventException(); }
645       remove { throw new UnlistenableEventException(); }
646     }
647
648     /// <summary>
649     /// 
650     /// </summary>
651     /// <value></value>
652     public event ItemInsertedHandler<T> ItemInserted
653     {
654       add { throw new UnlistenableEventException(); }
655       remove { throw new UnlistenableEventException(); }
656     }
657
658     /// <summary>
659     /// 
660     /// </summary>
661     /// <value></value>
662     public event ItemsRemovedHandler<T> ItemsRemoved
663     {
664       add { throw new UnlistenableEventException(); }
665       remove { throw new UnlistenableEventException(); }
666     }
667
668     /// <summary>
669     /// 
670     /// </summary>
671     /// <value></value>
672     public event ItemRemovedAtHandler<T> ItemRemovedAt
673     {
674       add { throw new UnlistenableEventException(); }
675       remove { throw new UnlistenableEventException(); }
676     }
677
678     /// <summary>
679     /// 
680     /// </summary>
681     /// <value></value>
682     public bool IsEmpty { get { return innerlist.IsEmpty; } }
683
684     /// <summary>
685     /// 
686     /// </summary>
687     /// <value></value>
688     public int Count { get { return innerlist.Count; } }
689
690     /// <summary>
691     /// 
692     /// </summary>
693     /// <value></value>
694     public Speed CountSpeed { get { return innerlist.CountSpeed; } }
695
696     /// <summary>
697     /// 
698     /// </summary>
699     /// <param name="array"></param>
700     /// <param name="index"></param>
701     public void CopyTo(T[] array, int index) { innerlist.CopyTo(array, index); }
702
703     /// <summary>
704     /// 
705     /// </summary>
706     /// <returns></returns>
707     public T[] ToArray() { return innerlist.ToArray(); }
708
709     /// <summary>
710     /// 
711     /// </summary>
712     /// <param name="action"></param>
713     public void Apply(Act<T> action) { innerlist.Apply(action); }
714
715     /// <summary>
716     /// 
717     /// </summary>
718     /// <param name="predicate"></param>
719     /// <returns></returns>
720     public bool Exists(Fun<T, bool> predicate) { return innerlist.Exists(predicate); }
721
722     /// <summary>
723     /// 
724     /// </summary>
725     /// <param name="predicate"></param>
726     /// <param name="item"></param>
727     /// <returns></returns>
728     public bool Find(Fun<T, bool> predicate, out T item) { return innerlist.Find(predicate, out item); }
729
730     /// <summary>
731     /// 
732     /// </summary>
733     /// <param name="predicate"></param>
734     /// <returns></returns>
735     public bool All(Fun<T, bool> predicate) { return innerlist.All(predicate); }
736
737     /// <summary>
738     /// 
739     /// </summary>
740     /// <returns></returns>
741     public T Choose() { return innerlist.Choose(); }
742
743     /// <summary>
744     /// 
745     /// </summary>
746     /// <param name="filter"></param>
747     /// <returns></returns>
748     public SCG.IEnumerable<T> Filter(Fun<T, bool> filter) { return innerlist.Filter(filter); }
749
750     #endregion
751
752     #region IEnumerable<T> Members
753
754     /// <summary>
755     /// 
756     /// </summary>
757     /// <returns></returns>
758     public SCG.IEnumerator<T> GetEnumerator() { return innerlist.GetEnumerator(); }
759     #endregion
760
761     #region IShowable Members
762
763     /// <summary>
764     /// 
765     /// </summary>
766     /// <param name="stringbuilder"></param>
767     /// <param name="rest"></param>
768     /// <param name="formatProvider"></param>
769     /// <returns></returns>
770     public bool Show(StringBuilder stringbuilder, ref int rest, IFormatProvider formatProvider)
771     { return innerlist.Show(stringbuilder, ref  rest, formatProvider); }
772
773     #endregion
774
775     #region IFormattable Members
776
777     /// <summary>
778     /// 
779     /// </summary>
780     /// <returns></returns>
781     public override string ToString() { return innerlist.ToString(); }
782
783
784     /// <summary>
785     /// 
786     /// </summary>
787     /// <param name="format"></param>
788     /// <param name="formatProvider"></param>
789     /// <returns></returns>
790     public virtual string ToString(string format, IFormatProvider formatProvider) { return innerlist.ToString(format, formatProvider); }
791
792     #endregion
793
794     #region IDirectedCollectionValue<T> Members
795
796     /// <summary>
797     /// 
798     /// </summary>
799     /// <returns></returns>
800     public IDirectedCollectionValue<T> Backwards() { return innerlist.Backwards(); }
801
802     /// <summary>
803     /// 
804     /// </summary>
805     /// <param name="predicate"></param>
806     /// <param name="item"></param>
807     /// <returns></returns>
808     public bool FindLast(Fun<T, bool> predicate, out T item) { return innerlist.FindLast(predicate, out item); }
809
810     #endregion
811
812     #region IDirectedEnumerable<T> Members
813
814     IDirectedEnumerable<T> IDirectedEnumerable<T>.Backwards() { return Backwards(); }
815
816     /// <summary>
817     /// 
818     /// </summary>
819     /// <value></value>
820     public EnumerationDirection Direction { get { return EnumerationDirection.Forwards; } }
821
822     #endregion
823
824     #region IDisposable Members
825
826     /// <summary>
827     /// Dispose this if a view else operation is illegal 
828     /// </summary>
829     /// <exception cref="FixedSizeCollectionException">If not a view</exception>
830     public void Dispose()
831     {
832       if (underlying == null)
833         throw new FixedSizeCollectionException();
834       else
835         innerlist.Dispose();
836     }
837
838     #endregion
839
840     #region ICloneable Members
841
842     /// <summary>
843     /// Make a shallow copy of this WrappedArray.
844     /// 
845     /// 
846     /// </summary>
847     /// <returns></returns>
848     public virtual object Clone()
849     {
850       return new WrappedArray<T>(innerlist.ToArray());
851     }
852
853     #endregion
854
855     #region System.Collections.Generic.IList<T> Members
856
857     void System.Collections.Generic.IList<T>.RemoveAt(int index)
858     {
859       throw new FixedSizeCollectionException();
860     }
861
862     void System.Collections.Generic.ICollection<T>.Add(T item)
863     {
864       throw new FixedSizeCollectionException();
865     }
866
867     #endregion
868
869     #region System.Collections.ICollection Members
870
871     bool System.Collections.ICollection.IsSynchronized
872     {
873       get { return false; }
874     }
875
876     [Obsolete]
877     Object System.Collections.ICollection.SyncRoot
878     {
879       get { return ((System.Collections.IList)innerlist).SyncRoot; }
880     }
881
882     void System.Collections.ICollection.CopyTo(Array arr, int index)
883     {
884       if (index < 0 || index + Count > arr.Length)
885         throw new ArgumentOutOfRangeException();
886
887       foreach (T item in this)
888         arr.SetValue(item, index++);
889     }
890     
891     #endregion
892
893     #region System.Collections.IList Members
894
895     Object System.Collections.IList.this[int index]
896     {
897       get { return this[index]; }
898       set { this[index] = (T)value; }
899     }
900
901     int System.Collections.IList.Add(Object o)
902     {
903       bool added = Add((T)o);
904       // What position to report if item not added? SC.IList.Add doesn't say
905       return added ? Count - 1 : -1;
906     }
907
908     bool System.Collections.IList.Contains(Object o)
909     {
910       return Contains((T)o);
911     }
912
913     int System.Collections.IList.IndexOf(Object o)
914     {
915       return Math.Max(-1, IndexOf((T)o));
916     }
917
918     void System.Collections.IList.Insert(int index, Object o)
919     {
920       Insert(index, (T)o);
921     }
922
923     void System.Collections.IList.Remove(Object o)
924     {
925       Remove((T)o);
926     }
927
928     void System.Collections.IList.RemoveAt(int index)
929     {
930       RemoveAt(index);
931     }
932
933     #endregion
934     
935     #region IEnumerable Members
936
937     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
938     {
939       throw new Exception("The method or operation is not implemented.");
940     }
941
942     #endregion
943   }
944 }