Exemple #1
0
 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 WriteToken(ArchiveMetadataToken token)
 {
     System.Diagnostics.Debug.Assert(0 <= (int)token && (int)token <= 25);
     WriteByte((byte)token);
 }
 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);
 }