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 |