From 1206c15853768062ed5889d383e29fbc8323d6b7 Mon Sep 17 00:00:00 2001 From: Tyler Dunn Date: Fri, 31 May 2024 15:52:55 -0400 Subject: [PATCH] Extend dart:typed_data support to other currently supported List types --- dart/lib/flat_buffers.dart | 52 ++++++++++++++++++++++++++++---- dart/test/flat_buffers_test.dart | 10 ++++-- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/dart/lib/flat_buffers.dart b/dart/lib/flat_buffers.dart index fe5148bb1..170ac241d 100644 --- a/dart/lib/flat_buffers.dart +++ b/dart/lib/flat_buffers.dart @@ -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> { @override @pragma('vm:prefer-inline') - List read(BufferContext bc, int offset) => - _FbFloat64List(bc, bc.derefObject(offset)); + List 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> { @@ -910,8 +935,15 @@ class Float32ListReader extends Reader> { @override @pragma('vm:prefer-inline') - List read(BufferContext bc, int offset) => - _FbFloat32List(bc, bc.derefObject(offset)); + List 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 { @@ -1131,8 +1163,16 @@ class Uint32ListReader extends Reader> { @override @pragma('vm:prefer-inline') - List read(BufferContext bc, int offset) => - _FbUint32List(bc, bc.derefObject(offset)); + List 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. diff --git a/dart/test/flat_buffers_test.dart b/dart/test/flat_buffers_test.dart index 0e7c6cd41..f170ab8f1 100644 --- a/dart/test/flat_buffers_test.dart +++ b/dart/test/flat_buffers_test.dart @@ -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 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 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 items = const Uint32ListReader().read(buf, 0); + expect(items is Uint32List, Endian.host == Endian.little); expect(items, hasLength(3)); expect(items, orderedEquals([1, 2, 0x9ABCDEF0])); } @@ -670,7 +674,7 @@ class BuilderTest { // read and verify BufferContext buf = BufferContext.fromBytes(byteList); List 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([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, ...