/// <summary> /// Restore the data saved by SaveTypes /// </summary> public void RestoreTypes() { _classes.Clear(); _classes.Add(_savedClasses.AsSlice()); _pairedBracketTypes.Clear(); _pairedBracketTypes.Add(_savedPairedBracketTypes.AsSlice()); }
/// <summary> /// Appends text to the bidi data. /// </summary> /// <param name="text">The text to process.</param> public void Append(ReadOnlySlice <char> text) { _classes.Add(text.Length); _pairedBracketTypes.Add(text.Length); _pairedBracketValues.Add(text.Length); // Resolve the BidiCharacterType, paired bracket type and paired // bracket values for all code points HasBrackets = false; HasEmbeddings = false; HasIsolates = false; int i = Length; var codePointEnumerator = new CodepointEnumerator(text); while (codePointEnumerator.MoveNext()) { var codepoint = codePointEnumerator.Current; // Look up BiDiClass var dir = codepoint.BiDiClass; _classes[i] = dir; switch (dir) { case BidiClass.LeftToRightEmbedding: case BidiClass.LeftToRightOverride: case BidiClass.RightToLeftEmbedding: case BidiClass.RightToLeftOverride: case BidiClass.PopDirectionalFormat: { HasEmbeddings = true; break; } case BidiClass.LeftToRightIsolate: case BidiClass.RightToLeftIsolate: case BidiClass.FirstStrongIsolate: case BidiClass.PopDirectionalIsolate: { HasIsolates = true; break; } } // Lookup paired bracket types var pbt = codepoint.PairedBracketType; _pairedBracketTypes[i] = pbt; if (pbt == BidiPairedBracketType.Open) { // Opening bracket types can never have a null pairing. codepoint.TryGetPairedBracket(out var paired); _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(paired).Value; HasBrackets = true; } else if (pbt == BidiPairedBracketType.Close) { _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(codepoint).Value; HasBrackets = true; } i++; } Length = i; Classes = _classes.AsSlice(0, Length); PairedBracketTypes = _pairedBracketTypes.AsSlice(0, Length); PairedBracketValues = _pairedBracketValues.AsSlice(0, Length); }