private void SkipToToken(ArchiveMetadataToken token) { while (ReadToken() != token) { SkipDataBlock(); } }
private void WriteUInt32Vector(IEnumerable <uint?> vector, ArchiveMetadataToken token) { var count = vector.Count(); var defined = vector.Count(x => x.HasValue); if (defined > 0) { WriteAlignedHeaderWithBitVector(vector.Select(x => x.HasValue), count, defined, token, 4); System.Diagnostics.Debug.Assert((mArchiveStream.Position & 3) == 0); foreach (var slot in vector) { if (slot.HasValue) { WriteInt32((int)slot.Value); } } } }
private void WriteToken(ArchiveMetadataToken token) { System.Diagnostics.Debug.Assert(0 <= (int)token && (int)token <= 25); WriteByte((byte)token); }
private void WriteUInt32Vector(IEnumerable<uint?> vector, ArchiveMetadataToken token) { var count = vector.Count(); var defined = vector.Count(x => x.HasValue); if (defined > 0) { WriteAlignedHeaderWithBitVector(vector.Select(x => x.HasValue), count, defined, token, 4); System.Diagnostics.Debug.Assert((mArchiveStream.Position & 3) == 0); foreach (var slot in vector) if (slot.HasValue) WriteInt32((int)slot.Value); } }
private void WriteDateVector(IEnumerable<DateTime?> dates, ArchiveMetadataToken token) { WriteUInt64Vector(dates.Select(x => x.HasValue ? (ulong)x.Value.ToFileTimeUtc() : default(ulong?)), token); }
private void WriteAlignedHeaderWithBitVector(IEnumerable<bool> bits, int vectorCount, int itemCount, ArchiveMetadataToken token, int itemSize) { var vectorSize = (itemCount == vectorCount) ? 0 : (vectorCount + 7) / 8; var contentSize = 2 + vectorSize + itemCount * itemSize; // Insert padding to align the begin of the content vector at a multiple of the given item size. WritePadding(3 + vectorSize + GetNumberSize(contentSize), itemSize); WriteToken(token); WriteNumber(contentSize); if (itemCount == vectorCount) { WriteByte(1); // all items defined == true } else { WriteByte(0); // all items defined == false, followed by a bitvector for the defined items WriteBitVector(bits); } WriteByte(0); // content vector is inline and not packed into a separate stream // caller inserts content vector (itemCount * itemSize) right behind this call }
private void WriteBitVectorWithHeader(ArchiveMetadataToken token, IEnumerable<bool> bits, int count) { WriteToken(token); WriteNumber((count + 7) / 8); WriteBitVector(bits); }
private void SkipToToken(ArchiveMetadataToken token) { while (ReadToken() != token) SkipDataBlock(); }
private void WriteDateVector(IEnumerable <DateTime?> dates, ArchiveMetadataToken token) { WriteUInt64Vector(dates.Select(x => x.HasValue ? (ulong)x.Value.ToFileTimeUtc() : default(ulong?)), token); }
private void WriteAlignedHeaderWithBitVector(IEnumerable <bool> bits, int vectorCount, int itemCount, ArchiveMetadataToken token, int itemSize) { var vectorSize = (itemCount == vectorCount) ? 0 : (vectorCount + 7) / 8; var contentSize = 2 + vectorSize + itemCount * itemSize; // Insert padding to align the begin of the content vector at a multiple of the given item size. WritePadding(3 + vectorSize + GetNumberSize(contentSize), itemSize); WriteToken(token); WriteNumber(contentSize); if (itemCount == vectorCount) { WriteByte(1); // all items defined == true } else { WriteByte(0); // all items defined == false, followed by a bitvector for the defined items WriteBitVector(bits); } WriteByte(0); // content vector is inline and not packed into a separate stream // caller inserts content vector (itemCount * itemSize) right behind this call }
private void WriteBitVectorWithHeader(ArchiveMetadataToken token, IEnumerable <bool> bits, int count) { WriteToken(token); WriteNumber((count + 7) / 8); WriteBitVector(bits); }