From 8a600041f814898fd22be0150aeb1be3ba896a2d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 10 Dec 2015 15:56:27 -0800 Subject: [PATCH] Add serialization support for BKTrees. --- .../Core/Portable/Utilities/BKTree.Edge.cs | 11 +++++ .../Core/Portable/Utilities/BKTree.Node.cs | 12 ++++++ .../Utilities/BKTree.Serialization.cs | 43 +++++++++++++++++++ .../Core/Portable/Utilities/BKTree.cs | 4 ++ .../Core/Portable/Workspaces.csproj | 1 + 5 files changed, 71 insertions(+) create mode 100644 src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs index 2aa54da3247..53107cc8cf7 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Edge.cs @@ -21,6 +21,17 @@ public Edge(int editDistance, int childNodeIndex) EditDistance = editDistance; ChildNodeIndex = childNodeIndex; } + + internal void WriteTo(ObjectWriter writer) + { + writer.WriteInt32(EditDistance); + writer.WriteInt32(ChildNodeIndex); + } + + internal static Edge ReadFrom(ObjectReader reader) + { + return new Edge(reader.ReadInt32(), reader.ReadInt32()); + } } } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs index e84e0e7d32b..c5447a097cd 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Node.cs @@ -27,6 +27,18 @@ public Node(char[] lowerCaseCharacters, int edgeCount, int firstEdgeIndex) EdgeCount = edgeCount; FirstEdgeIndex = firstEdgeIndex; } + + internal void WriteTo(ObjectWriter writer) + { + writer.WriteValue(LowerCaseCharacters); + writer.WriteInt32(EdgeCount); + writer.WriteInt32(FirstEdgeIndex); + } + + internal static Node ReadFrom(ObjectReader reader) + { + return new Node((char[])reader.ReadValue(), reader.ReadInt32(), reader.ReadInt32()); + } } } } diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs new file mode 100644 index 00000000000..c45f3f74c61 --- /dev/null +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.Serialization.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Roslyn.Utilities +{ + internal partial class BKTree + { + internal void WriteTo(ObjectWriter writer) + { + writer.WriteInt32(this._nodes.Length); + foreach (var node in _nodes) + { + node.WriteTo(writer); + } + + writer.WriteInt32(this._edges.Length); + foreach (var edge in _edges) + { + edge.WriteTo(writer); + } + } + + internal static BKTree ReadFrom(ObjectReader reader) + { + var nodes = new Node[reader.ReadInt32()]; + for (var i = 0; i < nodes.Length; i++) + { + nodes[i] = Node.ReadFrom(reader); + } + + var edges = new Edge[reader.ReadInt32()]; + for (var i = 0; i < edges.Length; i++) + { + edges[i] = Edge.ReadFrom(reader); + } + + return new BKTree(nodes, edges); + } + } +} diff --git a/src/Workspaces/Core/Portable/Utilities/BKTree.cs b/src/Workspaces/Core/Portable/Utilities/BKTree.cs index 84a717ef7ca..e36fe14510e 100644 --- a/src/Workspaces/Core/Portable/Utilities/BKTree.cs +++ b/src/Workspaces/Core/Portable/Utilities/BKTree.cs @@ -12,6 +12,10 @@ namespace Roslyn.Utilities { internal partial class BKTree { + public static readonly BKTree Empty = new BKTree( + SpecializedCollections.EmptyArray(), + SpecializedCollections.EmptyArray()); + // We have two completely flat arrays of structs (except for the char[] values the nodes // point to). These arrays fully represent the BK tree. The structure is as follows: // diff --git a/src/Workspaces/Core/Portable/Workspaces.csproj b/src/Workspaces/Core/Portable/Workspaces.csproj index 64b24100700..9a349f16c20 100644 --- a/src/Workspaces/Core/Portable/Workspaces.csproj +++ b/src/Workspaces/Core/Portable/Workspaces.csproj @@ -418,6 +418,7 @@ + -- GitLab