예제 #1
0
            public override void Write(StringTrieBuilder builder)
            {
                // Write the sub-nodes in reverse order: The jump lengths are deltas from
                // after their own positions, so if we wrote the minUnit sub-node first,
                // then its jump delta would be larger.
                // Instead we write the minUnit sub-node last, for a shorter delta.
                int  unitNumber      = length - 1;
                Node rightEdge       = equal[unitNumber];
                int  rightEdgeNumber = rightEdge == null ? firstEdgeNumber : rightEdge.Offset;

                do
                {
                    --unitNumber;
                    if (equal[unitNumber] != null)
                    {
                        equal[unitNumber].WriteUnlessInsideRightEdge(firstEdgeNumber, rightEdgeNumber, builder);
                    }
                } while (unitNumber > 0);
                // The maxUnit sub-node is written as the very last one because we do
                // not jump for it at all.
                unitNumber = length - 1;
                if (rightEdge == null)
                {
#pragma warning disable 612, 618
                    builder.WriteValueAndFinal(values[unitNumber], true);
#pragma warning restore 612, 618
                }
                else
                {
                    rightEdge.Write(builder);
                }
#pragma warning disable 612, 618
                offset = builder.Write(units[unitNumber]);
#pragma warning restore 612, 618
                // Write the rest of this node's unit-value pairs.
                while (--unitNumber >= 0)
                {
                    int  value;
                    bool isFinal;
                    if (equal[unitNumber] == null)
                    {
                        // Write the final value for the one string ending with this unit.
                        value   = values[unitNumber];
                        isFinal = true;
                    }
                    else
                    {
                        // Write the delta to the start position of the sub-node.
                        Debug.Assert(equal[unitNumber].Offset > 0);
                        value   = offset - equal[unitNumber].Offset;
                        isFinal = false;
                    }
#pragma warning disable 612, 618
                    builder.WriteValueAndFinal(value, isFinal);
                    offset = builder.Write(units[unitNumber]);
#pragma warning restore 612, 618
                }
            }
예제 #2
0
            public override void Write(StringTrieBuilder builder)
            {
                next.Write(builder);
#pragma warning disable 612, 618
                builder.Write(stringOffset, length);
                offset = builder.WriteValueAndType(hasValue, value, builder.MinLinearMatch + length - 1);
#pragma warning restore 612, 618
            }
예제 #3
0
 public override void Write(StringTrieBuilder builder)
 {
     // Encode the less-than branch first.
     lessThan.WriteUnlessInsideRightEdge(firstEdgeNumber, greaterOrEqual.Offset, builder);
     // Encode the greater-or-equal branch last because we do not jump for it at all.
     greaterOrEqual.Write(builder);
     // Write this node.
     Debug.Assert(lessThan.Offset > 0);
     builder.WriteDeltaTo(lessThan.Offset);  // less-than
     offset = builder.Write(unit);
 }
예제 #4
0
 public override void Write(StringTrieBuilder builder)
 {
     next.Write(builder);
     if (length <= builder.MinLinearMatch)
     {
         offset = builder.WriteValueAndType(hasValue, value, length - 1);
     }
     else
     {
         builder.Write(length - 1);
         offset = builder.WriteValueAndType(hasValue, value, 0);
     }
 }
예제 #5
0
            public override void Write(StringTrieBuilder builder)
            {
                next.Write(builder);
#pragma warning disable 612, 618
                if (length <= builder.MinLinearMatch)
                {
                    offset = builder.WriteValueAndType(hasValue, value, length - 1);
                }
                else
                {
                    builder.Write(length - 1);
                    offset = builder.WriteValueAndType(hasValue, value, 0);
#pragma warning restore 612, 618
                }
            }
예제 #6
0
 public override void Write(StringTrieBuilder builder)
 {
     next.Write(builder);
     builder.Write(stringOffset, length);
     offset = builder.WriteValueAndType(hasValue, value, builder.MinLinearMatch + length - 1);
 }