X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FArray.cs;h=d699446f2b5ce3aad52382b8900a6bde0a3161bd;hb=44e063161885fc7e5d288265e4241d163f98ad02;hp=946647ae149da3a979b204fbb60b6fb4a704e051;hpb=74770d376884f980a48871f7614a3e032f8ff97c;p=mono.git diff --git a/mcs/class/corlib/System/Array.cs b/mcs/class/corlib/System/Array.cs index 946647ae149..d699446f2b5 100644 --- a/mcs/class/corlib/System/Array.cs +++ b/mcs/class/corlib/System/Array.cs @@ -207,7 +207,7 @@ namespace System // we just decr the size, so, 0 - 1 == FINISHED const int FINISHED = -1; - Array array; + readonly Array array; int idx; internal InternalEnumerator (Array array) @@ -218,7 +218,6 @@ namespace System public void Dispose () { - idx = NOT_STARTED; } public bool MoveNext () @@ -312,12 +311,17 @@ namespace System public object GetValue (int index) { if (Rank != 1) - throw new ArgumentException (Locale.GetText ("Array was not a one-dimensional array.")); - if (index < GetLowerBound (0) || index > GetUpperBound (0)) + throw new ArgumentException (SR.Arg_RankMultiDimNotSupported); + + var lb = GetLowerBound (0); + if (index < lb || index > GetUpperBound (0)) throw new IndexOutOfRangeException (Locale.GetText ( "Index has to be between upper and lower bound of the array.")); - return GetValueImpl (index - GetLowerBound (0)); + if (GetType ().GetElementType ().IsPointer) + throw new NotSupportedException ("Type is not supported"); + + return GetValueImpl (index - lb); } public object GetValue (int index1, int index2) @@ -335,12 +339,17 @@ namespace System public void SetValue (object value, int index) { if (Rank != 1) - throw new ArgumentException (Locale.GetText ("Array was not a one-dimensional array.")); - if (index < GetLowerBound (0) || index > GetUpperBound (0)) + throw new ArgumentException (SR.Arg_RankMultiDimNotSupported); + + var lb = GetLowerBound (0); + if (index < lb || index > GetUpperBound (0)) throw new IndexOutOfRangeException (Locale.GetText ( "Index has to be >= lower bound and <= upper bound of the array.")); - SetValueImpl (value, index - GetLowerBound (0)); + if (GetType ().GetElementType ().IsPointer) + throw new NotSupportedException ("Type is not supported"); + + SetValueImpl (value, index - lb); } public void SetValue (object value, int index1, int index2) @@ -589,31 +598,6 @@ namespace System return source.IsAssignableFrom (target) || target.IsAssignableFrom (source); } - public static T[] FindAll (T[] array, Predicate match) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (match == null) - throw new ArgumentNullException ("match"); - - int pos = 0; - T[] d = Empty(); - for (int i = 0; i < array.Length; i++) { - if (match (array [i])) { - if (pos == d.Length) - Resize (ref d, pos == 0 ? 4 : pos * 2); - - d [pos++] = array [i]; - } - } - - if (pos != d.Length) - Resize (ref d, pos); - - return d; - } - [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] // // The constrained copy should guarantee that if there is an exception thrown @@ -624,9 +608,40 @@ namespace System Copy (sourceArray, sourceIndex, destinationArray, destinationIndex, length); } - object GetValueWithFlattenedIndex_NoErrorCheck (int flattenedIndex) + public static T[] Empty() { - return GetValueImpl (flattenedIndex); + return EmptyArray.Value; + } + + public void Initialize() + { + return; + } + + static int IndexOfImpl(T[] array, T value, int startIndex, int count) + { + return EqualityComparer.Default.IndexOf (array, value, startIndex, count); + } + + static int LastIndexOfImpl(T[] array, T value, int startIndex, int count) + { + return EqualityComparer.Default.LastIndexOf (array, value, startIndex, count); + } + + static void SortImpl (Array keys, Array items, int index, int length, IComparer comparer) + { + Object[] objKeys = keys as Object[]; + Object[] objItems = null; + if (objKeys != null) + objItems = items as Object[]; + + if (objKeys != null && (items == null || objItems != null)) { + SorterObjectArray sorter = new SorterObjectArray(objKeys, objItems, comparer); + sorter.Sort(index, length); + } else { + SorterGenericArray sorter = new SorterGenericArray(keys, items, comparer); + sorter.Sort(index, length); + } } #region Unsafe array operations @@ -678,5 +693,17 @@ namespace System return comparison(x, y); } } + + partial class ArrayEnumerator + { + public Object Current { + get { + if (_index < 0) throw new InvalidOperationException (SR.InvalidOperation_EnumNotStarted); + if (_index >= _endIndex) throw new InvalidOperationException (SR.InvalidOperation_EnumEnded); + if (_index == 0 && _array.GetType ().GetElementType ().IsPointer) throw new NotSupportedException ("Type is not supported"); + return _array.GetValueImpl(_index); + } + } + } } }