Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |