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 } }
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 }
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); }
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); } }
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 } }
public override void Write(StringTrieBuilder builder) { next.Write(builder); builder.Write(stringOffset, length); offset = builder.WriteValueAndType(hasValue, value, builder.MinLinearMatch + length - 1); }