Extend dart:typed_data support to other currently supported List types
This commit is contained in:
parent
0c2c426937
commit
1206c15853
|
@ -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.
|
||||
|
|
|
@ -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, ...
|
||||
|
|
Loading…
Reference in New Issue