Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: pkg/analyzer/lib/src/summary/flat_buffers.dart

Issue 1747663002: Support for boolean lists in FlatBuffer. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.summary.flat_buffers; 5 library analyzer.src.summary.flat_buffers;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:math'; 9 import 'dart:math';
10 import 'dart:typed_data'; 10 import 'dart:typed_data';
11 11
12 /** 12 /**
13 * Reader of lists of boolean values.
14 *
15 * The returned unmodifiable lists lazily read values on access.
16 */
17 class BoolListReader extends Reader<List<bool>> {
18 const BoolListReader();
19
20 @override
21 int get size => 4;
22
23 @override
24 List<bool> read(BufferPointer bp) => new _FbBoolList(bp.derefObject());
25 }
26
27 /**
13 * The reader of booleans. 28 * The reader of booleans.
14 */ 29 */
15 class BoolReader extends Reader<bool> { 30 class BoolReader extends Reader<bool> {
16 const BoolReader() : super(); 31 const BoolReader() : super();
17 32
18 @override 33 @override
19 int get size => 1; 34 int get size => 1;
20 35
21 @override 36 @override
22 bool read(BufferPointer bp) => bp._getInt8() != 0; 37 bool read(BufferPointer bp) => bp._getInt8() != 0;
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 _setUint32AtTail(_buf, tail, values.length); 343 _setUint32AtTail(_buf, tail, values.length);
329 tail -= 4; 344 tail -= 4;
330 for (Offset value in values) { 345 for (Offset value in values) {
331 _setUint32AtTail(_buf, tail, tail - value._tail); 346 _setUint32AtTail(_buf, tail, tail - value._tail);
332 tail -= 4; 347 tail -= 4;
333 } 348 }
334 return result; 349 return result;
335 } 350 }
336 351
337 /** 352 /**
353 * Write the given list of boolean [values].
354 */
355 Offset writeListBool(List<bool> values) {
356 int bitLength = values.length;
357 bool hasPartial = bitLength % 32 != 0;
358 int intLength = 1 + bitLength ~/ 32 + (hasPartial ? 1 : 0);
359 // Prepare the backing Uint32 list.
360 List<int> intItems = new List<int>(intLength);
361 // Put the bit length as the 0-th item.
362 intItems[0] = bitLength;
363 // Record every bit.
364 int itemIndex = 1;
365 int item = 0;
366 int mask = 1;
367 for (int bitIndex = 0; bitIndex < bitLength; bitIndex++) {
368 if (bitIndex != 0 && (bitIndex % 32 == 0)) {
369 intItems[itemIndex++] = item;
370 item = 0;
371 mask = 1;
372 }
373 if (values[bitIndex]) {
374 item |= mask;
375 }
376 mask <<= 1;
377 }
378 if (hasPartial) {
Paul Berry 2016/02/29 21:12:32 Change this to `if (values.isNotEmpty)`. Otherwis
379 intItems[itemIndex] = item;
380 }
381 // Write as a Uint32 list.
382 return writeListUint32(intItems);
383 }
384
385 /**
338 * Write the given list of 64-bit float [values]. 386 * Write the given list of 64-bit float [values].
339 */ 387 */
340 Offset writeListFloat64(List<double> values) { 388 Offset writeListFloat64(List<double> values) {
341 _ensureNoVTable(); 389 _ensureNoVTable();
342 _prepare(8, 1 + values.length); 390 _prepare(8, 1 + values.length);
343 Offset result = new Offset(_tail); 391 Offset result = new Offset(_tail);
344 int tail = _tail; 392 int tail = _tail;
345 _setUint32AtTail(_buf, tail, values.length); 393 _setUint32AtTail(_buf, tail, values.length);
346 tail -= 8; 394 tail -= 8;
347 for (double value in values) { 395 for (double value in values) {
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 T createObject(BufferPointer bp); 686 T createObject(BufferPointer bp);
639 687
640 @override 688 @override
641 T read(BufferPointer bp) { 689 T read(BufferPointer bp) {
642 bp = bp.derefObject(); 690 bp = bp.derefObject();
643 return createObject(bp); 691 return createObject(bp);
644 } 692 }
645 } 693 }
646 694
647 /** 695 /**
648 * Reader of lists of 32-bit float values. 696 * Reader of lists of unsigned 32-bit integer values.
649 * 697 *
650 * The returned unmodifiable lists lazily read values on access. 698 * The returned unmodifiable lists lazily read values on access.
651 */ 699 */
652 class Uint32ListReader extends Reader<List<int>> { 700 class Uint32ListReader extends Reader<List<int>> {
653 const Uint32ListReader(); 701 const Uint32ListReader();
654 702
655 @override 703 @override
656 int get size => 4; 704 int get size => 4;
657 705
658 @override 706 @override
(...skipping 20 matching lines...) Expand all
679 const Uint8Reader() : super(); 727 const Uint8Reader() : super();
680 728
681 @override 729 @override
682 int get size => 1; 730 int get size => 1;
683 731
684 @override 732 @override
685 int read(BufferPointer bp) => bp._getUint8(); 733 int read(BufferPointer bp) => bp._getUint8();
686 } 734 }
687 735
688 /** 736 /**
737 * List of booleans backed by 32-bit unsigned integers.
738 */
739 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
740 final _FbUint32List uint32List;
741
742 _FbBoolList(BufferPointer bp) : uint32List = new _FbUint32List(bp);
743
744 @override
745 int get length => uint32List[0];
746
747 @override
748 void set length(int i) =>
749 throw new StateError('Attempt to modify immutable list');
750
751 @override
752 bool operator [](int i) {
753 int index = i ~/ 32;
754 int mask = 1 << i % 32;
755 return uint32List[1 + index] & mask != 0;
756 }
757
758 @override
759 void operator []=(int i, bool e) =>
760 throw new StateError('Attempt to modify immutable list');
761 }
762
763 /**
689 * The list backed by 64-bit values - Uint64 length and Float64. 764 * The list backed by 64-bit values - Uint64 length and Float64.
690 */ 765 */
691 class _FbFloat64List extends _FbList<double> { 766 class _FbFloat64List extends _FbList<double> {
692 List<double> _items; 767 List<double> _items;
693 768
694 _FbFloat64List(BufferPointer bp) : super(bp); 769 _FbFloat64List(BufferPointer bp) : super(bp);
695 770
696 @override 771 @override
697 double operator [](int i) { 772 double operator [](int i) {
698 _items ??= new List<double>(length); 773 _items ??= new List<double>(length);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 // Table size. 915 // Table size.
841 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN); 916 buf.setUint16(bufOffset, tableSize, Endianness.LITTLE_ENDIAN);
842 bufOffset += 2; 917 bufOffset += 2;
843 // Field offsets. 918 // Field offsets.
844 for (int fieldOffset in fieldOffsets) { 919 for (int fieldOffset in fieldOffsets) {
845 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN); 920 buf.setUint16(bufOffset, fieldOffset, Endianness.LITTLE_ENDIAN);
846 bufOffset += 2; 921 bufOffset += 2;
847 } 922 }
848 } 923 }
849 } 924 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698