Skip to content

Commit befb119

Browse files
committed
WIP
1 parent 40ca72b commit befb119

File tree

4 files changed

+71
-10
lines changed

4 files changed

+71
-10
lines changed

NBitcoin.Bench/UInt256Bench.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,25 @@ public void WriteToString()
2525
{
2626
Value.ToString();
2727
}
28+
29+
#if HAS_SPAN
30+
[Benchmark]
31+
[Arguments(new char[] {
32+
'0','0','0','0','0','0','0','0',
33+
'0','0','0','0','0','0','0','0',
34+
'0','0','0','0','0','0','0','0',
35+
'0','0','0','0','0','0','0','0',
36+
'0','0','0','0','0','0','0','0',
37+
'0','0','0','0','0','0','0','0',
38+
'0','0','0','0','0','0','0','0',
39+
'0','0','0','0','0','0','0','0'
40+
})]
41+
public void WriteToSpanString(Span<char> destinationSpan)
42+
{
43+
Value.ToSpanString(destinationSpan);
44+
}
45+
#endif
46+
2847
[Benchmark]
2948
public void Read()
3049
{

NBitcoin.Tests/NBitcoin.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
<ProjectReference Include="..\NBitcoin.Altcoins\NBitcoin.Altcoins.csproj" />
4242
<ProjectReference Include="..\NBitcoin.TestFramework\NBitcoin.TestFramework.csproj" />
4343
<PackageReference Include="Microsoft.CSharp" Version="4.6.0" />
44-
<PackageReference Include="xunit" Version="2.4.1" />
45-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
44+
<PackageReference Include="xunit" Version="2.6.5" />
45+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
4646
<PrivateAssets>all</PrivateAssets>
4747
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
4848
</PackageReference>

NBitcoin.Tests/uint256_tests.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
using NBitcoin.Protocol;
2-
using System;
1+
using System;
32
using System.Collections.Generic;
43
using System.IO;
54
using System.Linq;
6-
using System.Reflection;
7-
using System.Text;
8-
using System.Threading.Tasks;
95
using Xunit;
106

117
namespace NBitcoin.Tests
@@ -147,7 +143,7 @@ public void uitnSerializationTests2()
147143

148144
[Fact]
149145
[Trait("UnitTest", "UnitTest")]
150-
public void uitnSerializationTests()
146+
public void uintSerializationTests()
151147
{
152148
MemoryStream ms = new MemoryStream();
153149
BitcoinStream stream = new BitcoinStream(ms, true);
@@ -193,6 +189,16 @@ public void uitnSerializationTests()
193189
Assert.True(vs2.SequenceEqual(vs));
194190
}
195191

192+
[Fact]
193+
[Trait("UnitTest", "UnitTest")]
194+
public void uintSpanSerializationTests()
195+
{
196+
var v1 = new uint256("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
197+
198+
Assert.Equal("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", v1.ToString());
199+
Assert.Equal("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff".AsSpan(), v1.ToSpanString());
200+
}
201+
196202
private void AssertEquals(uint256 a, uint256 b)
197203
{
198204
Assert.Equal(a, b);

NBitcoin/UInt256.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11

2+
using NBitcoin.DataEncoders;
23
using System;
3-
using System.Collections;
44
using System.Linq;
55
using System.Runtime.InteropServices;
6-
using NBitcoin.DataEncoders;
76

87
namespace NBitcoin
98
{
@@ -161,6 +160,43 @@ public override string ToString()
161160
return Encoder.EncodeData(bytes);
162161
}
163162

163+
#if HAS_SPAN
164+
/// <remarks>The method allocates a new 64 char array.</remarks>
165+
public Span<char> ToSpanString()
166+
{
167+
Span<char> result = new char[64];
168+
169+
ToSpanString(result);
170+
return result;
171+
}
172+
173+
/// <remarks>The method does not allocate.</remarks>
174+
public void ToSpanString(Span<char> destination)
175+
{
176+
Span<ulong> ulongs = stackalloc ulong[4];
177+
ulongs[0] = pn0;
178+
ulongs[1] = pn1;
179+
ulongs[2] = pn2;
180+
ulongs[3] = pn3;
181+
Span<byte> bytes = MemoryMarshal.Cast<ulong, byte>(ulongs);
182+
183+
if (BitConverter.IsLittleEndian)
184+
{
185+
for (int i = 31, j = 0; i >= 0; i--, j += 2)
186+
{
187+
HexEncoder.ToCharsBuffer(bytes[i], destination, startingIndex: j);
188+
}
189+
}
190+
else
191+
{
192+
for (int i = 0; i < 32; i++)
193+
{
194+
HexEncoder.ToCharsBuffer(bytes[i], destination, startingIndex: i);
195+
}
196+
}
197+
}
198+
#endif
199+
164200
public uint256(ulong b)
165201
{
166202
pn0 = (uint)b;

0 commit comments

Comments
 (0)