diff --git a/PersistentOrderedMap.sln b/PersistentOrderedMap.sln
index d13d62d..f313444 100644
--- a/PersistentOrderedMap.sln
+++ b/PersistentOrderedMap.sln
@@ -10,8 +10,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgainstImmutableDict", "benchmarks\AgainstImmutableDict\AgainstImmutableDict.csproj", "{13304F19-7ED3-4C40-9A08-46D539667D50}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgainstLanguageExt", "benchmarks\AgainstLanguageExt\AgainstLanguageExt.csproj", "{6C16526B-5139-4EA3-BF74-E6320F467198}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyBenchMarks", "benchmarks\MyBenchMarks\MyBenchMarks.csproj", "{769E1CEA-7E01-405B-80A2-95CBF432A2BA}"
EndProject
Global
@@ -22,7 +20,6 @@ Global
GlobalSection(NestedProjects) = preSolution
{CA49AA3C-0CE6-4735-887F-FB3631D63CEE} = {B0432C7A-80E2-4EA6-8FAB-B8F23A8C39DE}
{13304F19-7ED3-4C40-9A08-46D539667D50} = {E38B3FCB-0D4D-401D-A2FC-EDF41B755E53}
- {6C16526B-5139-4EA3-BF74-E6320F467198} = {E38B3FCB-0D4D-401D-A2FC-EDF41B755E53}
{769E1CEA-7E01-405B-80A2-95CBF432A2BA} = {E38B3FCB-0D4D-401D-A2FC-EDF41B755E53}
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
@@ -38,10 +35,6 @@ Global
{13304F19-7ED3-4C40-9A08-46D539667D50}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13304F19-7ED3-4C40-9A08-46D539667D50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13304F19-7ED3-4C40-9A08-46D539667D50}.Release|Any CPU.Build.0 = Release|Any CPU
- {6C16526B-5139-4EA3-BF74-E6320F467198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6C16526B-5139-4EA3-BF74-E6320F467198}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6C16526B-5139-4EA3-BF74-E6320F467198}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6C16526B-5139-4EA3-BF74-E6320F467198}.Release|Any CPU.Build.0 = Release|Any CPU
{769E1CEA-7E01-405B-80A2-95CBF432A2BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{769E1CEA-7E01-405B-80A2-95CBF432A2BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{769E1CEA-7E01-405B-80A2-95CBF432A2BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
diff --git a/PersistentOrderedMap/BTreeFunctions.cs b/PersistentOrderedMap/BTreeFunctions.cs
index 34c2222..0d7a7af 100644
--- a/PersistentOrderedMap/BTreeFunctions.cs
+++ b/PersistentOrderedMap/BTreeFunctions.cs
@@ -11,20 +11,20 @@ namespace PersistentOrderedMap
/// TryGetValue tries to get the value at mapping key. If it finds the key it sets th
/// out var to value and returns true.
- public static bool TryGetValue(Node root, K key, TStrategy strategy, out V value)
- where TStrategy : IKeyStrategy
+ public static bool TryGetValue(Node root, TK key, TStrategy strategy, out TV value)
+ where TStrategy : IKeyStrategy
{
// We always get a strategy to avoid branching already here
long keyPrefix = strategy.UsesPrefixes ? strategy.GetPrefix(key) : 0;
- Node current = root;
+ Node current = root;
while (true)
{
if (current.IsLeaf)
{
- var leaf = current.AsLeaf();
+ var leaf = current.AsLeaf();
int index = FindIndex(leaf, key, keyPrefix, strategy);
- if (index < leaf.Header.Count && strategy.Compare(leaf.Keys[index], key) == 0)
+ if (index < leaf.Header.Count && strategy.Compare(leaf.Keys![index], key) == 0)
{
value = leaf.Values[index];
return true;
@@ -41,8 +41,8 @@ namespace PersistentOrderedMap
}
}
- public static Node Set(Node root, K key, V value, TStrategy strategy, OwnerId owner, out bool countChanged)
- where TStrategy : IKeyStrategy
+ public static Node Set(Node root, TK key, TV value, TStrategy strategy, OwnerId owner, out bool countChanged)
+ where TStrategy : IKeyStrategy
{
root = root.EnsureEditable(owner);
@@ -52,8 +52,8 @@ namespace PersistentOrderedMap
if (newNode != null)
{
var newRoot = strategy.UsesPrefixes
- ? new PrefixInternalNode(owner)
- : new InternalNode(owner);
+ ? new PrefixInternalNode(owner)
+ : new InternalNode(owner);
newRoot.Keys[0] = sep;
newRoot.Children[0] = root;
@@ -71,27 +71,27 @@ namespace PersistentOrderedMap
return root;
}
- private static (Node? newNode, K separator ) InsertRecursive(Node node, K key, V value, IKeyStrategy strategy, OwnerId owner, out bool added)
+ private static (Node? newNode, TK separator ) InsertRecursive(Node node, TK key, TV value, IKeyStrategy strategy, OwnerId owner, out bool added)
{
long keyPrefix = strategy.UsesPrefixes ? strategy.GetPrefix(key) : 0;
if (node.IsLeaf)
{
- var leaf = node.AsLeaf();
+ var leaf = node.AsLeaf();
int index = FindIndex(leaf, key, keyPrefix, strategy);
- if (index < leaf.Header.Count && strategy.Compare(leaf.Keys[index], key) == 0)
+ if (index < leaf.Header.Count && strategy.Compare(leaf.Keys![index], key) == 0)
{
leaf.Values[index] = value;
added = false;
- return (null, default);
+ return (null, default)!;
}
added = true;
- if (leaf.Header.Count < LeafNode.Capacity)
+ if (leaf.Header.Count < LeafNode.Capacity)
{
InsertIntoLeaf(leaf, index, key, value, strategy);
- return (null, default);
+ return (null, default)!;
}
else
{
@@ -110,26 +110,25 @@ namespace PersistentOrderedMap
if (newNode != null)
{
- if (internalNode.Header.Count < InternalNode.Capacity - 1)
+ if (internalNode.Header.Count < InternalNode.Capacity - 1)
{
InsertIntoInternal(internalNode, index, sep, newNode, strategy);
- return (null, default);
- }
- else
- {
- return SplitInternal(internalNode, index, sep, newNode, strategy, owner);
+ return (null, default)!;
}
+
+ return SplitInternal(internalNode, index, sep, newNode, strategy, owner);
+
}
- return (null, default);
+ return (null, default)!;
}
}
- public static Node Remove(Node root, K key, TStrategy strategy, OwnerId owner, out bool countChanged)
- where TStrategy : IKeyStrategy
+ public static Node Remove(Node root, TK key, TStrategy strategy, OwnerId owner, out bool countChanged)
+ where TStrategy : IKeyStrategy
{
root = root.EnsureEditable(owner);
- bool rebalanceNeeded = RemoveRecursive(root, key, strategy, owner, out countChanged);
+ bool rebalanceNeeded = RemoveRecursive(root, key, strategy, owner, out countChanged);
if (rebalanceNeeded)
{
@@ -146,21 +145,21 @@ namespace PersistentOrderedMap
return root;
}
- private static bool RemoveRecursive(Node node, K key, TStrategy strategy, OwnerId owner, out bool removed)
- where TStrategy : IKeyStrategy
+ private static bool RemoveRecursive(Node node, TK key, TStrategy strategy, OwnerId owner, out bool removed)
+ where TStrategy : IKeyStrategy
{
long keyPrefix = strategy.UsesPrefixes ? strategy.GetPrefix(key) : 0;
if (node.IsLeaf)
{
- var leaf = node.AsLeaf();
+ var leaf = node.AsLeaf();
int index = FindIndex(leaf, key, keyPrefix, strategy);
- if (index < leaf.Header.Count && strategy.Compare(leaf.Keys[index], key) == 0)
+ if (index < leaf.Header.Count && strategy.Compare(leaf.Keys![index], key) == 0)
{
RemoveFromLeaf(leaf, index, strategy);
removed = true;
- return leaf.Header.Count < LeafNode.MergeThreshold;
+ return leaf.Header.Count < LeafNode.MergeThreshold;
}
removed = false;
@@ -174,11 +173,11 @@ namespace PersistentOrderedMap
var child = internalNode.Children[index]!.EnsureEditable(owner);
internalNode.Children[index] = child;
- bool childUnderflow = RemoveRecursive(child, key, strategy, owner, out removed);
+ bool childUnderflow = RemoveRecursive(child, key, strategy, owner, out removed);
if (removed && childUnderflow)
{
- return HandleUnderflow(internalNode, index, strategy, owner);
+ return HandleUnderflow(internalNode, index, strategy, owner);
}
return false;
}
@@ -189,16 +188,16 @@ namespace PersistentOrderedMap
// ---------------------------------------------------------
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static int FindIndex(LeafNode node, K key, long keyPrefix, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ internal static int FindIndex(LeafNode node, TK key, long keyPrefix, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
- if (typeof(K) == typeof(int))
+ if (typeof(TK) == typeof(int))
{
- Span keys = node.GetKeys();
- ref K firstKeyRef = ref MemoryMarshal.GetReference(keys);
- ref int firstIntRef = ref Unsafe.As(ref firstKeyRef);
+ Span keys = node.GetKeys();
+ ref TK firstKeyRef = ref MemoryMarshal.GetReference(keys);
+ ref int firstIntRef = ref Unsafe.As(ref firstKeyRef);
ReadOnlySpan intKeys = MemoryMarshal.CreateReadOnlySpan(ref firstIntRef, keys.Length);
- int intKey = Unsafe.As(ref key);
+ int intKey = Unsafe.As(ref key);
return IntScanner.FindFirstGreaterOrEqual(intKeys, intKey);
}
@@ -212,17 +211,17 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static int FindRoutingIndex(InternalNode node, K key, long keyPrefix, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ internal static int FindRoutingIndex(InternalNode node, TK key, long keyPrefix, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
- if (typeof(K) == typeof(int))
+ if (typeof(TK) == typeof(int))
{
- Span keys = node.GetKeys();
- ref K firstKeyRef = ref MemoryMarshal.GetReference(keys);
- ref int firstIntRef = ref Unsafe.As(ref firstKeyRef);
+ Span keys = node.GetKeys();
+ ref TK firstKeyRef = ref MemoryMarshal.GetReference(keys);
+ ref int firstIntRef = ref Unsafe.As(ref firstKeyRef);
ReadOnlySpan intKeys = MemoryMarshal.CreateReadOnlySpan(ref firstIntRef, keys.Length);
- int intKey = Unsafe.As(ref key);
+ int intKey = Unsafe.As(ref key);
return IntScanner.FindFirstGreater(intKeys, intKey);
}
if (!strategy.UsesPrefixes)
@@ -235,8 +234,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int RefineSearch(int startIndex, ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int RefineSearch(int startIndex, ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int i = startIndex;
while (i < keys.Length && strategy.Compare(keys[i], key) < 0) i++;
@@ -244,8 +243,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int RefineRouting(int startIndex, ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int RefineRouting(int startIndex, ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int i = startIndex;
while (i < keys.Length && strategy.Compare(keys[i], key) <= 0) i++;
@@ -253,8 +252,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int FallbackSearchKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int FallbackSearchKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
return strategy.UseBinarySearch
? BinarySearchKeys(keys, key, strategy)
@@ -262,8 +261,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int FallbackRoutingKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int FallbackRoutingKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
return strategy.UseBinarySearch
? BinaryRoutingKeys(keys, key, strategy)
@@ -271,8 +270,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int LinearSearchKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int LinearSearchKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int i = 0;
while (i < keys.Length && strategy.Compare(keys[i], key) < 0) i++;
@@ -280,8 +279,8 @@ namespace PersistentOrderedMap
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int LinearRoutingKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int LinearRoutingKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int i = 0;
while (i < keys.Length && strategy.Compare(keys[i], key) <= 0) i++;
@@ -290,17 +289,17 @@ namespace PersistentOrderedMap
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int BinarySearchKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int BinarySearchKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int low = 0;
int high = keys.Length - 1;
- ref K keysRef = ref MemoryMarshal.GetReference(keys);
+ ref TK keysRef = ref MemoryMarshal.GetReference(keys);
while (low <= high)
{
int mid = low + ((high - low) >> 1);
- K midKey = Unsafe.Add(ref keysRef, mid);
+ TK midKey = Unsafe.Add(ref keysRef, mid);
int cmp = strategy.Compare(midKey, key);
if (cmp == 0) return mid;
@@ -310,17 +309,17 @@ namespace PersistentOrderedMap
return low;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static int BinaryRoutingKeys(ReadOnlySpan keys, K key, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static int BinaryRoutingKeys(ReadOnlySpan keys, TK key, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int low = 0;
int high = keys.Length - 1;
- ref K keysRef = ref MemoryMarshal.GetReference(keys);
+ ref TK keysRef = ref MemoryMarshal.GetReference(keys);
while (low <= high)
{
int mid = low + ((high - low) >> 1);
- K midKey = Unsafe.Add(ref keysRef, mid);
+ TK midKey = Unsafe.Add(ref keysRef, mid);
int cmp = strategy.Compare(midKey, key);
if (cmp <= 0) low = mid + 1;
@@ -333,19 +332,8 @@ namespace PersistentOrderedMap
// Insertion Logic
// ---------------------------------------------------------
- private class SeplitResult
- {
- public Node NewNode;
- public K Separator;
- public SeplitResult(Node newNode, K separator)
- {
- NewNode = newNode;
- Separator = separator;
- }
- }
-
- private static void InsertIntoLeaf(LeafNode leaf, int index, K key, V value, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static void InsertIntoLeaf(LeafNode leaf, int index, TK key, TV value, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int count = leaf.Header.Count;
if (index < count)
@@ -360,7 +348,7 @@ namespace PersistentOrderedMap
}
}
- leaf.Keys[index] = key;
+ leaf.Keys![index] = key;
leaf.Values[index] = value;
if (strategy.UsesPrefixes)
@@ -371,10 +359,10 @@ namespace PersistentOrderedMap
leaf.SetCount(count + 1);
}
- private static (Node, K) SplitLeaf(LeafNode left, int insertIndex, K key, V value, TStrategy strategy, OwnerId owner)
- where TStrategy : IKeyStrategy
+ private static (Node, TK) SplitLeaf(LeafNode left, int insertIndex, TK key, TV value, TStrategy strategy, OwnerId owner)
+ where TStrategy : IKeyStrategy
{
- var right = new LeafNode(owner, strategy.UsesPrefixes);
+ var right = new LeafNode(owner, strategy.UsesPrefixes);
int totalCount = left.Header.Count;
int splitPoint = (insertIndex == totalCount) ? totalCount : (insertIndex == 0 ? 0 : totalCount / 2);
@@ -403,21 +391,21 @@ namespace PersistentOrderedMap
InsertIntoLeaf(right, insertIndex - splitPoint, key, value, strategy);
}
- return (right, right.Keys[0]);
+ return (right, right.Keys![0]);
}
- private static void InsertIntoInternal(InternalNode node, int index, K separator, Node newChild, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static void InsertIntoInternal(InternalNode node, int index, TK separator, Node newChild, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int count = node.Header.Count;
if (index < count)
{
int moveCount = count - index;
- Span keysSpan = node.Keys;
+ Span keysSpan = node.Keys;
keysSpan.Slice(index, moveCount).CopyTo(keysSpan.Slice(index + 1));
- Span> childrenSpan = node.Children;
+ Span> childrenSpan = node.Children!;
childrenSpan.Slice(index + 1, moveCount).CopyTo(childrenSpan.Slice(index + 2));
if (strategy.UsesPrefixes)
@@ -437,26 +425,26 @@ namespace PersistentOrderedMap
node.SetCount(count + 1);
}
- private static (Node, K) SplitInternal(InternalNode left, int insertIndex, K separator, Node newChild, TStrategy strategy, OwnerId owner)
- where TStrategy : IKeyStrategy
+ private static (Node, TK) SplitInternal(InternalNode left, int insertIndex, TK separator, Node newChild, TStrategy strategy, OwnerId owner)
+ where TStrategy : IKeyStrategy
{
var right = strategy.UsesPrefixes
- ? new PrefixInternalNode(owner)
- : new InternalNode(owner);
+ ? new PrefixInternalNode(owner)
+ : new InternalNode(owner);
int count = left.Header.Count;
int splitPoint = count / 2;
- K upKey = left.Keys[splitPoint];
+ TK upKey = left.Keys[splitPoint];
int moveCount = count - splitPoint - 1;
if (moveCount > 0)
{
- Span leftKeys = left.Keys;
- Span rightKeys = right.Keys;
+ Span leftKeys = left.Keys;
+ Span rightKeys = right.Keys;
leftKeys.Slice(splitPoint + 1, moveCount).CopyTo(rightKeys);
- Span> leftChildren = left.Children;
- Span> rightChildren = right.Children;
+ Span> leftChildren = left.Children!;
+ Span> rightChildren = right.Children!;
leftChildren.Slice(splitPoint + 1, moveCount + 1).CopyTo(rightChildren);
if (strategy.UsesPrefixes)
@@ -484,8 +472,8 @@ namespace PersistentOrderedMap
// Removal Logic
// ---------------------------------------------------------
- private static void RemoveFromLeaf(LeafNode leaf, int index, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static void RemoveFromLeaf(LeafNode leaf, int index, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
int count = leaf.Header.Count;
int moveCount = count - index - 1;
@@ -504,8 +492,8 @@ namespace PersistentOrderedMap
leaf.SetCount(count - 1);
}
- private static bool HandleUnderflow(InternalNode parent, int childIndex, TStrategy strategy, OwnerId owner)
- where TStrategy : IKeyStrategy
+ private static bool HandleUnderflow(InternalNode parent, int childIndex, TStrategy strategy, OwnerId owner)
+ where TStrategy : IKeyStrategy
{
if (childIndex < parent.Header.Count)
{
@@ -515,13 +503,13 @@ namespace PersistentOrderedMap
if (CanBorrow(rightSibling))
{
- RotateLeft(parent, childIndex, leftChild, rightSibling, strategy);
+ RotateLeft(parent, childIndex, leftChild, rightSibling, strategy);
return false;
}
else
{
- Merge(parent, childIndex, leftChild, rightSibling, strategy);
- return parent.Header.Count < LeafNode.MergeThreshold;
+ Merge(parent, childIndex, leftChild, rightSibling, strategy);
+ return parent.Header.Count < LeafNode.MergeThreshold;
}
}
else if (childIndex > 0)
@@ -532,31 +520,31 @@ namespace PersistentOrderedMap
if (CanBorrow(leftSibling))
{
- RotateRight(parent, childIndex - 1, leftSibling, rightChild, strategy);
+ RotateRight(parent, childIndex - 1, leftSibling, rightChild, strategy);
return false;
}
else
{
- Merge(parent, childIndex - 1, leftSibling, rightChild, strategy);
- return parent.Header.Count < LeafNode.MergeThreshold;
+ Merge(parent, childIndex - 1, leftSibling, rightChild, strategy);
+ return parent.Header.Count < LeafNode.MergeThreshold;
}
}
return true;
}
- private static bool CanBorrow(Node node)
+ private static bool CanBorrow(Node node)
{
return node.Header.Count > 8 + 1;
}
- private static void Merge(InternalNode parent, int separatorIndex, Node left, Node right, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static void Merge(InternalNode parent, int separatorIndex, Node left, Node right, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
if (left.IsLeaf)
{
- var leftLeaf = left.AsLeaf();
- var rightLeaf = right.AsLeaf();
+ var leftLeaf = left.AsLeaf();
+ var rightLeaf = right.AsLeaf();
int lCount = leftLeaf.Header.Count;
int rCount = rightLeaf.Header.Count;
@@ -576,7 +564,7 @@ namespace PersistentOrderedMap
var leftInternal = left.AsInternal();
var rightInternal = right.AsInternal();
- K separator = parent.Keys[separatorIndex];
+ TK separator = parent.Keys[separatorIndex];
int lCount = leftInternal.Header.Count;
leftInternal.Keys[lCount] = separator;
@@ -587,8 +575,8 @@ namespace PersistentOrderedMap
}
int rCount = rightInternal.Header.Count;
- Span rightKeys = rightInternal.Keys;
- Span leftKeys = leftInternal.Keys;
+ Span rightKeys = rightInternal.Keys;
+ Span leftKeys = leftInternal.Keys;
rightKeys.Slice(0, rCount).CopyTo(leftKeys.Slice(lCount + 1));
if (strategy.UsesPrefixes)
@@ -596,8 +584,8 @@ namespace PersistentOrderedMap
rightInternal.AllPrefixes.Slice(0, rCount).CopyTo(leftInternal.AllPrefixes.Slice(lCount + 1));
}
- Span> rightChildren = rightInternal.Children;
- Span> leftChildren = leftInternal.Children;
+ Span> rightChildren = rightInternal.Children!;
+ Span> leftChildren = leftInternal.Children!;
rightChildren.Slice(0, rCount + 1).CopyTo(leftChildren.Slice(lCount + 1));
leftInternal.SetCount(lCount + 1 + rCount);
@@ -608,7 +596,7 @@ namespace PersistentOrderedMap
if (moveCount > 0)
{
- Span parentKeys = parent.Keys;
+ Span parentKeys = parent.Keys;
parentKeys.Slice(separatorIndex + 1, moveCount).CopyTo(parentKeys.Slice(separatorIndex));
if (strategy.UsesPrefixes)
@@ -616,22 +604,22 @@ namespace PersistentOrderedMap
parent.AllPrefixes.Slice(separatorIndex + 1, moveCount).CopyTo(parent.AllPrefixes.Slice(separatorIndex));
}
- Span> parentChildren = parent.Children;
+ Span> parentChildren = parent.Children!;
parentChildren.Slice(separatorIndex + 2, moveCount).CopyTo(parentChildren.Slice(separatorIndex + 1));
}
parent.SetCount(pCount - 1);
}
- private static void RotateLeft(InternalNode parent, int separatorIndex, Node left, Node right, TStrategy strategy)
- where TStrategy : IKeyStrategy
+ private static void RotateLeft(InternalNode parent, int separatorIndex, Node left, Node right, TStrategy strategy)
+ where TStrategy : IKeyStrategy
{
if (left.IsLeaf)
{
- var leftLeaf = left.AsLeaf();
- var rightLeaf = right.AsLeaf();
+ var leftLeaf = left.AsLeaf();
+ var rightLeaf = right.AsLeaf