diff --git a/PersistentMap/BTreeFunctions.cs b/PersistentMap/BTreeFunctions.cs
index ca199fc..4a7a41e 100644
--- a/PersistentMap/BTreeFunctions.cs
+++ b/PersistentMap/BTreeFunctions.cs
@@ -10,9 +10,12 @@ namespace PersistentMap
// Public API
// ---------------------------------------------------------
+ /// 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
{
+ // We always get a strategy to avoid branching already here
long keyPrefix = strategy.UsesPrefixes ? strategy.GetPrefix(key) : 0;
Node current = root;
@@ -43,6 +46,7 @@ namespace PersistentMap
{
root = root.EnsureEditable(owner);
+ // Todo, this should really be made a tuple return value to not stress the GC
var splitResult = InsertRecursive(root, key, value, strategy, owner, out countChanged);
if (splitResult != null)
@@ -212,7 +216,7 @@ namespace PersistentMap
where TStrategy : IKeyStrategy
{
-if (typeof(K) == typeof(int))
+ if (typeof(K) == typeof(int))
{
Span keys = node.GetKeys();
ref K firstKeyRef = ref MemoryMarshal.GetReference(keys);
@@ -391,13 +395,13 @@ if (typeof(K) == typeof(int))
right.SetCount(moveCount);
if (insertIndex < splitPoint || (splitPoint == 0 && insertIndex == 0))
-{
- InsertIntoLeaf(left, insertIndex, key, value, strategy);
-}
-else
-{
- InsertIntoLeaf(right, insertIndex - splitPoint, key, value, strategy);
-}
+ {
+ InsertIntoLeaf(left, insertIndex, key, value, strategy);
+ }
+ else
+ {
+ InsertIntoLeaf(right, insertIndex - splitPoint, key, value, strategy);
+ }
return new SplitResult(right, right.Keys[0]);
}
diff --git a/PersistentMap/KeyStrategies/IntScanner.cs b/PersistentMap/KeyStrategies/IntScanner.cs
index 3c19856..325436d 100644
--- a/PersistentMap/KeyStrategies/IntScanner.cs
+++ b/PersistentMap/KeyStrategies/IntScanner.cs
@@ -44,7 +44,7 @@ public static class IntScanner
{
var vData = Avx2.LoadVector256(ptr + i);
var vResult = Avx2.CompareGreaterThan(vData, vTarget);
-
+
// MoveMask creates a 32-bit integer from the most significant bit of each byte.
var mask = (uint)Avx2.MoveMask(vResult.AsByte());
@@ -73,7 +73,7 @@ public static class IntScanner
fixed (int* ptr = keys)
{
var vData = Avx512F.LoadVector512(ptr + i);
-
+
// Vector512 API is used directly here to cleanly get the mask
var mask = Vector512.GreaterThanOrEqual(vData, vTarget);
@@ -88,7 +88,7 @@ public static class IntScanner
return LinearScan(keys.Slice(i), target) + i;
}
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int FindFirstGreater(ReadOnlySpan keys, int target)
{
if (!Avx2.IsSupported || keys.Length < 8)
@@ -107,7 +107,7 @@ public static class IntScanner
return i;
return keys.Length;
}
-
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static unsafe int ScanAvx2Greater(ReadOnlySpan keys, int target)
{
@@ -122,7 +122,7 @@ public static class IntScanner
{
var vData = Avx2.LoadVector256(ptr + i);
var vResult = Avx2.CompareGreaterThan(vData, vTarget);
-
+
var mask = (uint)Avx2.MoveMask(vResult.AsByte());
if (mask != 0)
@@ -135,7 +135,7 @@ public static class IntScanner
return LinearScanGreater(keys.Slice(i), target) + i;
}
-[MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static unsafe int ScanAvx512Greater(ReadOnlySpan keys, int target)
{
var vTarget = Vector512.Create(target);
@@ -147,7 +147,7 @@ public static class IntScanner
fixed (int* ptr = keys)
{
var vData = Avx512F.LoadVector512(ptr + i);
-
+
// Use GreaterThan instead of GreaterThanOrEqual
var mask = Vector512.GreaterThan(vData, vTarget);
diff --git a/PersistentMap/Nodes.cs b/PersistentMap/Nodes.cs
index 1e1d6ba..59075c4 100644
--- a/PersistentMap/Nodes.cs
+++ b/PersistentMap/Nodes.cs
@@ -90,10 +90,10 @@ public abstract class Node
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
-public PrefixInternalNode AsPrefixInternal()
-{
- return Unsafe.As>(this);
-}
+ public PrefixInternalNode AsPrefixInternal()
+ {
+ return Unsafe.As>(this);
+ }
}
public sealed class LeafNode : Node