protected int GetArrayOffset(TargetMemoryAccess target, int[] indices)
{
if (!GetArrayBounds (target))
throw new LocationInvalidException ();
if (indices.Length != Rank)
throw new ArgumentException ();
if (bounds.IsMultiDimensional) {
for (int i = 0; i < Rank; i++) {
if (indices [i] < bounds.LowerBounds [i])
throw new ArgumentException ();
if (indices [i] > bounds.UpperBounds [i])
throw new ArgumentException ();
}
} else if (!bounds.IsUnbound &&
((indices [0] < 0) || (indices [0] >= bounds.Length))) {
throw new ArgumentException ();
}
int index = indices [0];
for (int i = 1; i < Rank; i++) {
int length = bounds.UpperBounds [i] - bounds.LowerBounds [i] + 1;
index = index * length + indices [i];
}
return index * Type.GetElementSize (target);
}