Skip to content

Commit

Permalink
make MemorySequenceComparer public
Browse files Browse the repository at this point in the history
  • Loading branch information
Harry committed Jun 24, 2022
1 parent dcaa5bb commit 60c2a04
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 64 deletions.
37 changes: 37 additions & 0 deletions src/bctklib/MemorySequenceComparer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;

namespace Neo.BlockchainToolkit
{
public class MemorySequenceComparer : IEqualityComparer<ReadOnlyMemory<byte>>, IComparer<ReadOnlyMemory<byte>>
{
public static MemorySequenceComparer Default { get; } = new MemorySequenceComparer(false);
public static MemorySequenceComparer Reverse { get; } = new MemorySequenceComparer(true);

private readonly bool reverse;

private MemorySequenceComparer(bool reverse = false)
{
this.reverse = reverse;
}

public bool Equals(ReadOnlyMemory<byte> x, ReadOnlyMemory<byte> y) => Equals(x.Span, y.Span);

public int GetHashCode(ReadOnlyMemory<byte> obj) => GetHashCode(obj.Span);

public int Compare(ReadOnlyMemory<byte> x, ReadOnlyMemory<byte> y)
{
var compare = x.Span.SequenceCompareTo(y.Span);
return reverse ? -compare : compare;
}

public static bool Equals(ReadOnlySpan<byte> x, ReadOnlySpan<byte> y) => x.SequenceEqual(y);

public static int GetHashCode(ReadOnlySpan<byte> span)
{
HashCode hash = default;
hash.AddBytes(span);
return hash.ToHashCode();
}
}
}
2 changes: 1 addition & 1 deletion src/bctklib/persistence/MemoryTrackingStore.Snapshot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Snapshot : ISnapshot
readonly IReadOnlyStore store;
readonly TrackingMap trackingMap;
readonly Action<TrackingMap> commitAction;
TrackingMap writeBatchMap = TrackingMap.Empty.WithComparers(ReadOnlyMemoryComparer.Default);
TrackingMap writeBatchMap = TrackingMap.Empty.WithComparers(MemorySequenceComparer.Default);

public Snapshot(IReadOnlyStore store, TrackingMap trackingMap, Action<TrackingMap> commitAction)
{
Expand Down
6 changes: 3 additions & 3 deletions src/bctklib/persistence/MemoryTrackingStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace Neo.BlockchainToolkit.Persistence
public partial class MemoryTrackingStore : IStore
{
readonly IReadOnlyStore store;
TrackingMap trackingMap = TrackingMap.Empty.WithComparers(ReadOnlyMemoryComparer.Default);
TrackingMap trackingMap = TrackingMap.Empty.WithComparers(MemorySequenceComparer.Default);

public MemoryTrackingStore(IReadOnlyStore store)
{
Expand Down Expand Up @@ -65,8 +65,8 @@ static bool Contains(byte[]? key, TrackingMap trackingMap, IReadOnlyStore store)
}

var comparer = direction == SeekDirection.Forward
? ReadOnlyMemoryComparer.Default
: ReadOnlyMemoryComparer.Reverse;
? MemorySequenceComparer.Default
: MemorySequenceComparer.Reverse;

var memoryItems = trackingMap
.Where(kvp => kvp.Value.IsT0)
Expand Down
4 changes: 2 additions & 2 deletions src/bctklib/persistence/PersistentTrackingStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ static bool Contains(byte[]? key, RocksDb db, ColumnFamilyHandle columnFamily, R
var storeItems = store.Seek(key, direction).Where(KeyUntracked);

var comparer = direction == SeekDirection.Forward
? ReadOnlyMemoryComparer.Default
: ReadOnlyMemoryComparer.Reverse;
? MemorySequenceComparer.Default
: MemorySequenceComparer.Reverse;

return trackedItems.Concat(storeItems).OrderBy(kvp => kvp.Key, comparer);

Expand Down
50 changes: 0 additions & 50 deletions src/bctklib/persistence/ReadOnlyMemoryComparer.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ public RpcFoundStates FindStates(UInt256 rootHash, UInt160 scriptHash, ReadOnlyM
var hash = HashCode.Combine(
rootHash,
scriptHash,
ReadOnlyMemoryComparer.GetHashCode(prefix.Span),
ReadOnlyMemoryComparer.GetHashCode(from.Span),
MemorySequenceComparer.GetHashCode(prefix.Span),
MemorySequenceComparer.GetHashCode(from.Span),
count);
return foundStates.GetOrAdd(hash,
_ => rpcClient.FindStates(rootHash, scriptHash, prefix.Span, from.Span, count));
Expand All @@ -49,7 +49,7 @@ public UInt256 GetBlockHash(uint index)
{
var doo = new Dictionary<int, RpcFoundStates>();

var hash = HashCode.Combine(rootHash, scriptHash, ReadOnlyMemoryComparer.GetHashCode(key.Span));
var hash = HashCode.Combine(rootHash, scriptHash, MemorySequenceComparer.GetHashCode(key.Span));
return retrievedStates.GetOrAdd(hash, _ => rpcClient.GetProvenState(rootHash, scriptHash, key.Span));
}

Expand All @@ -61,7 +61,7 @@ public RpcStateRoot GetStateRoot(uint index)
public byte[] GetLedgerStorage(ReadOnlyMemory<byte> key)
{
var contractHash = Neo.SmartContract.Native.NativeContract.Ledger.Hash;
var hash = ReadOnlyMemoryComparer.GetHashCode(key.Span);
var hash = MemorySequenceComparer.GetHashCode(key.Span);
return storages.GetOrAdd(hash, _ => rpcClient.GetStorage(contractHash, key.Span));
}

Expand Down
4 changes: 2 additions & 2 deletions src/bctklib/persistence/StateServiceStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,8 @@ static byte[] GetLedgerCurrentBlock(ICachingClient rpcClient, uint index)
IEnumerable<(byte[] Key, byte[] Value)> Seek(UInt160 contractHash, int contractId, ReadOnlyMemory<byte> prefix, SeekDirection direction)
{
var comparer = direction == SeekDirection.Forward
? ReadOnlyMemoryComparer.Default
: ReadOnlyMemoryComparer.Reverse;
? MemorySequenceComparer.Default
: MemorySequenceComparer.Reverse;

return EnumerateFindStates(cachingClient, rootHash, contractHash, prefix)
.Select(kvp =>
Expand Down
5 changes: 3 additions & 2 deletions test/test.bctklib/ReadOnlyStoreTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using FluentAssertions;
using Neo.BlockchainToolkit;
using Neo.BlockchainToolkit.Persistence;
using Neo.Persistence;
using Xunit;
Expand Down Expand Up @@ -191,7 +192,7 @@ internal static void test_seek_forwards_with_prefix(IReadOnlyStore store)
using var _ = store as IDisposable;
var key = new byte[] { 1, 0 };
var expected = TestData
.Where(kvp => ReadOnlyMemoryComparer.Default.Compare(kvp.key, key) >= 0);
.Where(kvp => MemorySequenceComparer.Default.Compare(kvp.key, key) >= 0);
store.Seek(key, SeekDirection.Forward).Should().BeEquivalentTo(expected);
}

Expand All @@ -207,7 +208,7 @@ internal static void test_seek_backwards_with_prefix(IReadOnlyStore store)
using var _ = store as IDisposable;
var key = new byte[] { 2, 0 };
var expected = TestData
.Where(kvp => ReadOnlyMemoryComparer.Reverse.Compare(kvp.key, key) >= 0)
.Where(kvp => MemorySequenceComparer.Reverse.Compare(kvp.key, key) >= 0)
.Reverse();
store.Seek(key, SeekDirection.Backward).Should().BeEquivalentTo(expected);
}
Expand Down

0 comments on commit 60c2a04

Please sign in to comment.