Exemple #1
0
        /// <summary>
        /// Creates a PipData instance.
        /// </summary>
        internal static PipData CreateInternal(PipDataEntry entry, PipDataEntryList entries, StringId entriesBinarySegmentPointer)
        {
            Contract.Requires(entry.EntryType == PipDataEntryType.NestedDataHeader);
            Contract.Requires(entry.GetStringValue().IsValid);

            return(new PipData(entry, entries, entriesBinarySegmentPointer));
        }
Exemple #2
0
        /// <summary>
        /// Returns the PipDataBuilder back to its initial state.
        /// </summary>
        public void Clear()
        {
            m_entries.Clear();

            // Add entry which will be replaced with the count of the number of contained entries
            m_entries.Add(PipDataEntry.CreateNestedDataStart(0));
            m_nestedDataFragmentCountStack.Clear();
            m_currentPipDataCountInfo = default(PipDataCountInfo);
        }
Exemple #3
0
        private PipData(PipDataEntry entry, PipDataEntryList entries, StringId entriesBinarySegmentPointer)
        {
            Contract.Requires(entry.EntryType == PipDataEntryType.NestedDataHeader);
            Contract.Requires(entry.Escaping != PipDataFragmentEscaping.Invalid);
            Contract.Requires(entries.Count != 0);

            HeaderEntry = entry;
            Entries     = entries;
            m_entriesBinarySegmentPointer = entriesBinarySegmentPointer;
        }
Exemple #4
0
            protected override BinaryStringSegment ReadBinaryStringSegment(ref byte[] buffer)
            {
                int count = ReadInt32Compact();

                return(PipDataBuilder.WriteEntries(GetEntries(), count, ref m_pipDatabuffer));

                IEnumerable <PipDataEntry> GetEntries()
                {
                    for (int i = 0; i < count; i++)
                    {
                        yield return(PipDataEntry.Deserialize(m_baseInliningReader));
                    }
                }
            }
Exemple #5
0
            public override BinaryStringSegment ReadStringIdValue(InlinedStringKind kind, ref byte[] buffer)
            {
                if (kind == InlinedStringKind.PipData)
                {
                    int count = ReadInt32Compact();

                    return(PipDataBuilder.WriteEntries(GetEntries(), count, ref m_pipDatabuffer));

                    IEnumerable <PipDataEntry> GetEntries()
                    {
                        for (int i = 0; i < count; i++)
                        {
                            yield return(PipDataEntry.Deserialize(this));
                        }
                    }
                }
                else
                {
                    return(base.ReadStringIdValue(kind, ref buffer));
                }
            }
Exemple #6
0
        internal static PipData Deserialize(PipReader reader)
        {
            Contract.Requires(reader != null);
            var              entriesBinarySegmentPointer = reader.ReadPipDataEntriesPointer();
            PipDataEntry     headerEntry;
            PipDataEntryList entries;

            if (entriesBinarySegmentPointer.IsValid)
            {
                headerEntry = PipDataEntry.Deserialize(reader);

                // Use the string table to get the raw bytes to back the entries
                entries = new PipDataEntryList(reader.StringTable.GetBytes(entriesBinarySegmentPointer));
            }
            else
            {
                var count = reader.ReadInt32Compact();
                if (count == 0)
                {
                    return(Invalid);
                }

                headerEntry = PipDataEntry.Deserialize(reader);
                var entriesArray = new PipDataEntry[count];
                for (int i = 0; i < count; i++)
                {
                    entriesArray[i] = PipDataEntry.Deserialize(reader);
                }

                entries = PipDataEntryList.FromEntries(entriesArray);
            }

            Contract.Assume(headerEntry.EntryType == PipDataEntryType.NestedDataHeader);
            Contract.Assume(headerEntry.Escaping != PipDataFragmentEscaping.Invalid);
            return(new PipData(headerEntry, entries, entriesBinarySegmentPointer));
        }