// Decodes a generalized (non-SZ/vector) array type represented by the element type followed by // its rank and optional sizes and lower bounds. private static TType DecodeArrayType <TType>(ref BlobReader blobReader, ISignatureTypeProvider <TType> provider) { TType elementType = DecodeType(ref blobReader, provider); int rank = blobReader.ReadCompressedInteger(); var sizes = ImmutableArray <int> .Empty; var lowerBounds = ImmutableArray <int> .Empty; int sizesCount = blobReader.ReadCompressedInteger(); if (sizesCount > 0) { var array = new int[sizesCount]; for (int i = 0; i < sizesCount; i++) { array[i] = blobReader.ReadCompressedInteger(); } sizes = ImmutableArray.Create(array); } int lowerBoundsCount = blobReader.ReadCompressedInteger(); if (lowerBoundsCount > 0) { var array = new int[lowerBoundsCount]; for (int i = 0; i < lowerBoundsCount; i++) { array[i] = blobReader.ReadCompressedSignedInteger(); } lowerBounds = ImmutableArray.Create(array); } var arrayShape = new ArrayShape(rank, sizes, lowerBounds); return(provider.GetArrayType(elementType, arrayShape)); }
private TType DecodeArrayType(ref BlobReader blobReader) { // PERF_TODO: Cache/reuse common case of small number of all-zero lower-bounds. TType elementType = DecodeType(ref blobReader); int rank = blobReader.ReadCompressedInteger(); var sizes = ImmutableArray<int>.Empty; var lowerBounds = ImmutableArray<int>.Empty; int sizesCount = blobReader.ReadCompressedInteger(); if (sizesCount > 0) { var builder = ImmutableArray.CreateBuilder<int>(sizesCount); for (int i = 0; i < sizesCount; i++) { builder.Add(blobReader.ReadCompressedInteger()); } sizes = builder.MoveToImmutable(); } int lowerBoundsCount = blobReader.ReadCompressedInteger(); if (lowerBoundsCount > 0) { var builder = ImmutableArray.CreateBuilder<int>(lowerBoundsCount); for (int i = 0; i < lowerBoundsCount; i++) { builder.Add(blobReader.ReadCompressedSignedInteger()); } lowerBounds = builder.MoveToImmutable(); } var arrayShape = new ArrayShape(rank, sizes, lowerBounds); return _provider.GetArrayType(elementType, arrayShape); }
public RoType GetArrayType(RoType elementType, ArrayShape shape) => _typeProvider.GetArrayType(elementType.SkipTypeWrappers(), shape);