From dc25b802a758abd8cd6c8329224c6cb9ada45be5 Mon Sep 17 00:00:00 2001 From: Sergey Mikolaitis Date: Wed, 11 Jan 2023 03:30:06 +0300 Subject: [PATCH] [Text] add pooled list and pooled stack usage --- .../TextFormatting/Unicode/BiDiAlgorithm.cs | 22 ++++++++++++------- .../Media/TextFormatting/Unicode/BiDiData.cs | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs index 3372d2be51..0bea4def28 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; +using Avalonia.Collections.Pooled; using Avalonia.Utilities; namespace Avalonia.Media.TextFormatting.Unicode @@ -27,7 +28,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// as much as possible. /// /// - internal sealed class BidiAlgorithm : IDisposable + internal struct BidiAlgorithm : IDisposable { /// /// The original BiDiClass classes as provided by the caller @@ -97,7 +98,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The status stack used during resolution of explicit /// embedding and isolating runs /// - private readonly Stack _statusStack = new Stack(); + private readonly PooledStack _statusStack = new PooledStack(); /// /// Mapping used to virtually remove characters for rule X9 @@ -107,7 +108,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// /// Re-usable list of level runs /// - private readonly List _levelRuns = new List(); + private readonly PooledList _levelRuns = new PooledList(); /// /// Mapping for the current isolating sequence, built @@ -118,7 +119,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// /// A stack of pending isolate openings used by FindIsolatePairs() /// - private readonly Stack _pendingIsolateOpenings = new Stack(); + private readonly PooledStack _pendingIsolateOpenings = new PooledStack(); /// /// The level of the isolating run currently being processed @@ -174,17 +175,17 @@ namespace Avalonia.Media.TextFormatting.Unicode /// Reusable list of pending opening brackets used by the /// LocatePairedBrackets method /// - private readonly List _pendingOpeningBrackets = new List(); + private readonly PooledList _pendingOpeningBrackets = new PooledList(); /// /// Resolved list of paired brackets /// - private readonly List _pairedBrackets = new List(); + private readonly PooledList _pairedBrackets = new PooledList(); /// /// Initializes a new instance of the class. /// - internal BidiAlgorithm() + public BidiAlgorithm() { } @@ -1272,7 +1273,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// Locate all pair brackets in the current isolating run /// /// A sorted list of BracketPairs - private List LocatePairedBrackets() + private PooledList LocatePairedBrackets() { // Clear work collections _pendingOpeningBrackets.Clear(); @@ -1719,8 +1720,13 @@ namespace Avalonia.Media.TextFormatting.Unicode { _workingClassesBuffer.Dispose(); _resolvedLevelsBuffer.Dispose(); + _statusStack.Dispose(); _x9Map.Dispose(); + _levelRuns.Dispose(); _isolatedRunMapping.Dispose(); + _pendingIsolateOpenings.Dispose(); + _pendingOpeningBrackets.Dispose(); + _pairedBrackets.Dispose(); } } } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs index 7e5b3a6620..644f7e9a8a 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs @@ -11,7 +11,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// Represents a unicode string and all associated attributes /// for each character required for the bidirectional Unicode algorithm /// - internal class BidiData : IDisposable + internal struct BidiData : IDisposable { private ArrayBuilder _classes; private ArrayBuilder _pairedBracketTypes;