Skip to content

Commit 0036a2c

Browse files
committed
refactor: Modified Contains And ContainsAsync params changed to ReadOnlySpan<byte>
1 parent 0df2caf commit 0036a2c

File tree

9 files changed

+88
-19
lines changed

9 files changed

+88
-19
lines changed

src/BloomFilter.CSRedis/FilterCSRedis.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,15 @@ public override async ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elemen
114114
return results;
115115
}
116116

117-
public override bool Contains(byte[] element)
117+
public override bool Contains(ReadOnlySpan<byte> element)
118118
{
119119
var positions = ComputeHash(element);
120120
return GetBit(positions).All(a => a);
121121
}
122122

123-
public override async ValueTask<bool> ContainsAsync(byte[] element)
123+
public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)
124124
{
125-
var positions = ComputeHash(element);
125+
var positions = ComputeHash(element.Span);
126126
var results = await GetBitAsync(positions);
127127
return results.All(a => a);
128128
}

src/BloomFilter.EasyCaching/FilterEasyCachingRedis.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ public override async ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elemen
9696
return results;
9797
}
9898

99-
public override bool Contains(byte[] element)
99+
public override bool Contains(ReadOnlySpan<byte> element)
100100
{
101101
var positions = ComputeHash(element);
102102
return GetBit(positions).All(a => a);
103103
}
104104

105-
public override async ValueTask<bool> ContainsAsync(byte[] element)
105+
public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)
106106
{
107-
var positions = ComputeHash(element);
107+
var positions = ComputeHash(element.Span);
108108
var results = await GetBitAsync(positions);
109109
return results.All(a => a);
110110
}

src/BloomFilter.FreeRedis/FilterFreeRedis.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,15 @@ public override async ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elemen
114114
return results;
115115
}
116116

117-
public override bool Contains(byte[] element)
117+
public override bool Contains(ReadOnlySpan<byte> element)
118118
{
119119
var positions = ComputeHash(element);
120120
return GetBit(positions).All(a => a);
121121
}
122122

123-
public override async ValueTask<bool> ContainsAsync(byte[] element)
123+
public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)
124124
{
125-
var positions = ComputeHash(element);
125+
var positions = ComputeHash(element.Span);
126126
var results = await GetBitAsync(positions);
127127
return results.All(a => a);
128128
}

src/BloomFilter.Redis/FilterRedis.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public override async ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elemen
126126
/// </summary>
127127
/// <param name="element"></param>
128128
/// <returns></returns>
129-
public override bool Contains(byte[] element)
129+
public override bool Contains(ReadOnlySpan<byte> element)
130130
{
131131
var positions = ComputeHash(element);
132132

@@ -135,9 +135,9 @@ public override bool Contains(byte[] element)
135135
return results.All(a => a);
136136
}
137137

138-
public override async ValueTask<bool> ContainsAsync(byte[] element)
138+
public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)
139139
{
140-
var positions = ComputeHash(element);
140+
var positions = ComputeHash(element.Span);
141141

142142
var results = await _redisBitOperate.GetAsync(_redisKey, positions);
143143

src/BloomFilter/BloomFilterExtensions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ public static class BloomFilterExtensions
5959

6060
#endregion String
6161

62+
#region ReadOnlySpan<char>
63+
64+
public static bool Add(this IBloomFilter bloomFilter, ReadOnlySpan<char> data) => bloomFilter.Add(data.ToUtf8().Span);
65+
66+
public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, ReadOnlyMemory<char> data) => bloomFilter.AddAsync(data.Span.ToUtf8());
67+
68+
public static bool Contains(this IBloomFilter bloomFilter, ReadOnlySpan<char> data) => bloomFilter.Contains(data.ToUtf8().Span);
69+
70+
public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, ReadOnlyMemory<char> data) => bloomFilter.ContainsAsync(data.Span.ToUtf8());
71+
72+
#endregion String
73+
6274
#region Double
6375

6476
public static bool Add(this IBloomFilter bloomFilter, double data) => bloomFilter.Add(BitConverter.GetBytes(data));

src/BloomFilter/Filter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,14 @@ public Filter(string name, uint capacity, uint hashes, HashFunction hashFunction
141141
/// </summary>
142142
/// <param name="element"></param>
143143
/// <returns></returns>
144-
public abstract bool Contains(byte[] element);
144+
public abstract bool Contains(ReadOnlySpan<byte> element);
145145

146146
/// <summary>
147147
/// Async Tests whether an element is present in the filter
148148
/// </summary>
149149
/// <param name="element"></param>
150150
/// <returns></returns>
151-
public abstract ValueTask<bool> ContainsAsync(byte[] element);
151+
public abstract ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);
152152

153153
/// <summary>
154154
/// Tests whether an elements is present in the filter

src/BloomFilter/FilterMemory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public override ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements)
151151
/// </summary>
152152
/// <param name="element"></param>
153153
/// <returns></returns>
154-
public override bool Contains(byte[] element)
154+
public override bool Contains(ReadOnlySpan<byte> element)
155155
{
156156
var positions = ComputeHash(element);
157157
lock (sync)
@@ -165,9 +165,9 @@ public override bool Contains(byte[] element)
165165
return true;
166166
}
167167

168-
public override ValueTask<bool> ContainsAsync(byte[] element)
168+
public override ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)
169169
{
170-
return new ValueTask<bool>(Contains(element));
170+
return new ValueTask<bool>(Contains(element.Span));
171171
}
172172

173173
public override IList<bool> Contains(IEnumerable<byte[]> elements)

src/BloomFilter/IBloomFilter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ public interface IBloomFilter : IDisposable
4747
/// </summary>
4848
/// <param name="element"></param>
4949
/// <returns></returns>
50-
bool Contains(byte[] element);
50+
bool Contains(ReadOnlySpan<byte> element);
5151

5252
/// <summary>
5353
/// Async Tests whether an element is present in the filter
5454
/// </summary>
5555
/// <param name="element"></param>
5656
/// <returns></returns>
57-
ValueTask<bool> ContainsAsync(byte[] element);
57+
ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);
5858

5959
/// <summary>
6060
/// Tests whether an elements is present in the filter
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System;
2+
using System.Text;
3+
4+
namespace BloomFilter;
5+
6+
internal static class StringSpanExtensions
7+
{
8+
public static ReadOnlyMemory<byte> ToUtf8(this ReadOnlySpan<char> value)
9+
{
10+
#if NET6_0_OR_GREATER
11+
Memory<byte> bytes = new byte[Encoding.UTF8.GetByteCount(value)];
12+
var bytesWritten = Encoding.UTF8.GetBytes(value, bytes.Span);
13+
return bytes.Slice(0, bytesWritten);
14+
15+
#else
16+
var chars = value.ToArray();
17+
var bytes = new byte[Encoding.UTF8.GetByteCount(chars)];
18+
var bytesWritten = Encoding.UTF8.GetBytes(chars, 0, value.Length, bytes, 0);
19+
return new ReadOnlyMemory<byte>(bytes, 0, bytesWritten);
20+
#endif
21+
}
22+
23+
public static ReadOnlyMemory<char> FromUtf8(this ReadOnlySpan<byte> source)
24+
{
25+
#if NET6_0_OR_GREATER
26+
source = source.WithoutBom();
27+
Memory<char> chars = new char[Encoding.UTF8.GetCharCount(source)];
28+
var charsWritten = Encoding.UTF8.GetChars(source, chars.Span);
29+
return chars.Slice(0, charsWritten);
30+
#else
31+
var bytes = source.WithoutBom().ToArray();
32+
var chars = new char[Encoding.UTF8.GetCharCount(bytes)];
33+
var charsWritten = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0);
34+
return new ReadOnlyMemory<char>(chars, 0, charsWritten);
35+
36+
#endif
37+
}
38+
39+
public static byte[] ToUtf8Bytes(this ReadOnlySpan<char> value)
40+
{
41+
return ToUtf8(value).ToArray();
42+
}
43+
44+
public static ReadOnlySpan<char> WithoutBom(this ReadOnlySpan<char> value)
45+
{
46+
return value.Length > 0 && value[0] == 65279
47+
? value.Slice(1)
48+
: value;
49+
}
50+
51+
public static ReadOnlySpan<byte> WithoutBom(this ReadOnlySpan<byte> value)
52+
{
53+
return value.Length > 3 && value[0] == 0xEF && value[1] == 0xBB && value[2] == 0xBF
54+
? value.Slice(3)
55+
: value;
56+
}
57+
}

0 commit comments

Comments
 (0)