Chromium Code Reviews| Index: pkg/analyzer/lib/src/summary/flat_buffers.dart |
| diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart |
| index 65a786a650a19879153a7cf6175cb0b0b50af0d5..b16054be51adcf6f3e650614f88d26d655207389 100644 |
| --- a/pkg/analyzer/lib/src/summary/flat_buffers.dart |
| +++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart |
| @@ -10,6 +10,21 @@ import 'dart:math'; |
| import 'dart:typed_data'; |
| /** |
| + * Reader of lists of boolean values. |
| + * |
| + * The returned unmodifiable lists lazily read values on access. |
| + */ |
| +class BoolListReader extends Reader<List<bool>> { |
| + const BoolListReader(); |
| + |
| + @override |
| + int get size => 4; |
| + |
| + @override |
| + List<bool> read(BufferPointer bp) => new _FbBoolList(bp.derefObject()); |
| +} |
| + |
| +/** |
| * The reader of booleans. |
| */ |
| class BoolReader extends Reader<bool> { |
| @@ -335,6 +350,39 @@ class Builder { |
| } |
| /** |
| + * Write the given list of boolean [values]. |
| + */ |
| + Offset writeListBool(List<bool> values) { |
| + int bitLength = values.length; |
| + bool hasPartial = bitLength % 32 != 0; |
| + int intLength = 1 + bitLength ~/ 32 + (hasPartial ? 1 : 0); |
| + // Prepare the backing Uint32 list. |
| + List<int> intItems = new List<int>(intLength); |
| + // Put the bit length as the 0-th item. |
| + intItems[0] = bitLength; |
| + // Record every bit. |
| + int itemIndex = 1; |
| + int item = 0; |
| + int mask = 1; |
| + for (int bitIndex = 0; bitIndex < bitLength; bitIndex++) { |
| + if (bitIndex != 0 && (bitIndex % 32 == 0)) { |
| + intItems[itemIndex++] = item; |
| + item = 0; |
| + mask = 1; |
| + } |
| + if (values[bitIndex]) { |
| + item |= mask; |
| + } |
| + mask <<= 1; |
| + } |
| + if (hasPartial) { |
|
Paul Berry
2016/02/29 21:12:32
Change this to `if (values.isNotEmpty)`. Otherwis
|
| + intItems[itemIndex] = item; |
| + } |
| + // Write as a Uint32 list. |
| + return writeListUint32(intItems); |
| + } |
| + |
| + /** |
| * Write the given list of 64-bit float [values]. |
| */ |
| Offset writeListFloat64(List<double> values) { |
| @@ -645,7 +693,7 @@ abstract class TableReader<T> extends Reader<T> { |
| } |
| /** |
| - * Reader of lists of 32-bit float values. |
| + * Reader of lists of unsigned 32-bit integer values. |
| * |
| * The returned unmodifiable lists lazily read values on access. |
| */ |
| @@ -686,6 +734,33 @@ class Uint8Reader extends Reader<int> { |
| } |
| /** |
| + * List of booleans backed by 32-bit unsigned integers. |
| + */ |
| +class _FbBoolList extends Object with ListMixin<bool> implements List<bool> { |
| + final _FbUint32List uint32List; |
| + |
| + _FbBoolList(BufferPointer bp) : uint32List = new _FbUint32List(bp); |
| + |
| + @override |
| + int get length => uint32List[0]; |
| + |
| + @override |
| + void set length(int i) => |
| + throw new StateError('Attempt to modify immutable list'); |
| + |
| + @override |
| + bool operator [](int i) { |
| + int index = i ~/ 32; |
| + int mask = 1 << i % 32; |
| + return uint32List[1 + index] & mask != 0; |
| + } |
| + |
| + @override |
| + void operator []=(int i, bool e) => |
| + throw new StateError('Attempt to modify immutable list'); |
| +} |
| + |
| +/** |
| * The list backed by 64-bit values - Uint64 length and Float64. |
| */ |
| class _FbFloat64List extends _FbList<double> { |