Extend dart:typed_data support to other currently supported List types

This commit is contained in:
Tyler Dunn 2024-05-31 15:52:55 -04:00
parent 0c2c426937
commit 1206c15853
2 changed files with 53 additions and 9 deletions

View File

@ -52,6 +52,24 @@ class BufferContext {
return _buffer.buffer.asUint16List(_buffer.offsetInBytes + offset, length);
}
@pragma('vm:prefer-inline')
Uint32List _asUint32List(int offset, int length) {
assert(Endian.host == Endian.little);
return _buffer.buffer.asUint32List(_buffer.offsetInBytes + offset, length);
}
@pragma('vm:prefer-inline')
Float32List _asFloat32List(int offset, int length) {
assert(Endian.host == Endian.little);
return _buffer.buffer.asFloat32List(_buffer.offsetInBytes + offset, length);
}
@pragma('vm:prefer-inline')
Float64List _asFloat64List(int offset, int length) {
assert(Endian.host == Endian.little);
return _buffer.buffer.asFloat64List(_buffer.offsetInBytes + offset, length);
}
@pragma('vm:prefer-inline')
double _getFloat64(int offset) => _buffer.getFloat64(offset, Endian.little);
@ -897,8 +915,15 @@ class Float64ListReader extends Reader<List<double>> {
@override
@pragma('vm:prefer-inline')
List<double> read(BufferContext bc, int offset) =>
_FbFloat64List(bc, bc.derefObject(offset));
List<double> read(BufferContext bc, int offset) {
if (Endian.host == Endian.little) {
final listOffset = bc.derefObject(offset);
final length = bc._getUint32(listOffset);
return bc._asFloat64List(listOffset + _sizeofUint32, length);
} else {
return _FbFloat64List(bc, bc.derefObject(offset));
}
}
}
class Float32ListReader extends Reader<List<double>> {
@ -910,8 +935,15 @@ class Float32ListReader extends Reader<List<double>> {
@override
@pragma('vm:prefer-inline')
List<double> read(BufferContext bc, int offset) =>
_FbFloat32List(bc, bc.derefObject(offset));
List<double> read(BufferContext bc, int offset) {
if (Endian.host == Endian.little) {
final listOffset = bc.derefObject(offset);
final length = bc._getUint32(listOffset);
return bc._asFloat32List(listOffset + _sizeofUint32, length);
} else {
return _FbFloat32List(bc, bc.derefObject(offset));
}
}
}
class Float64Reader extends Reader<double> {
@ -1131,8 +1163,16 @@ class Uint32ListReader extends Reader<List<int>> {
@override
@pragma('vm:prefer-inline')
List<int> read(BufferContext bc, int offset) =>
_FbUint32List(bc, bc.derefObject(offset));
List<int> read(BufferContext bc, int offset) {
if (Endian.host == Endian.little) {
final listOffset = bc.derefObject(offset);
final length = bc._getUint32(listOffset);
return bc._asUint32List(listOffset + _sizeofUint32, length);
} else {
return _FbUint32List(bc, bc.derefObject(offset));
}
}
}
/// The reader of unsigned 64-bit integers.

View File

@ -1,3 +1,5 @@
// ignore_for_file: non_constant_identifier_names
import 'dart:typed_data';
import 'dart:io' as io;
@ -543,7 +545,7 @@ class BuilderTest {
// read and verify
BufferContext buf = BufferContext.fromBytes(byteList);
List<double> items = const Float64ListReader().read(buf, 0);
expect(items is Float64List, Endian.host == Endian.little);
expect(items, hasLength(values.length));
for (int i = 0; i < values.length; i++) {
expect(values[i], closeTo(items[i], .001));
@ -563,6 +565,7 @@ class BuilderTest {
// read and verify
BufferContext buf = BufferContext.fromBytes(byteList);
List<double> items = const Float32ListReader().read(buf, 0);
expect(items is Float32List, Endian.host == Endian.little);
expect(items, hasLength(5));
for (int i = 0; i < values.length; i++) {
expect(values[i], closeTo(items[i], .001));
@ -655,6 +658,7 @@ class BuilderTest {
// read and verify
BufferContext buf = BufferContext.fromBytes(byteList);
List<int> items = const Uint32ListReader().read(buf, 0);
expect(items is Uint32List, Endian.host == Endian.little);
expect(items, hasLength(3));
expect(items, orderedEquals(<int>[1, 2, 0x9ABCDEF0]));
}
@ -670,7 +674,7 @@ class BuilderTest {
// read and verify
BufferContext buf = BufferContext.fromBytes(byteList);
List<int> items = const Uint16ListReader().read(buf, 0);
expect(items is Uint16List, true, skip: Endian.host == Endian.big);
expect(items is Uint16List, Endian.host == Endian.little);
expect(items, hasLength(3));
expect(items, orderedEquals(<int>[1, 2, 60000]));
}
@ -845,9 +849,9 @@ class ObjectAPITest {
final offset = monster.pack(fbBuilder);
expect(offset, isNonZero);
fbBuilder.finish(offset);
final data = fbBuilder.buffer;
// TODO currently broken because of struct builder issue, see #6688
// final data = fbBuilder.buffer;
// final monster2 = example.Monster(data); // Monster (reader)
// expect(
// // map Monster => MonsterT, Vec3 => Vec3T, ...