Add ByteArraySearcher to CsvLib.
This commit is contained in:
66
CsvLib.Tests/ByteArraySearcherTests.cs
Normal file
66
CsvLib.Tests/ByteArraySearcherTests.cs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
using CsvLib;
|
||||||
|
|
||||||
|
namespace CvsLib;
|
||||||
|
|
||||||
|
public class ByteArraySearcherTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Contains__EmptyNeedle_ReturnsTrue()
|
||||||
|
{
|
||||||
|
byte[] haystack = { 1, 2, 3, 4, 5 };
|
||||||
|
byte[] needle = Array.Empty<byte>();
|
||||||
|
ByteArraySearcher searcher = new(needle);
|
||||||
|
|
||||||
|
bool result = searcher.Contains(haystack);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Contains__NeedleAtBeginning_ReturnsTrue()
|
||||||
|
{
|
||||||
|
byte[] haystack = { 1, 2, 3, 4, 5 };
|
||||||
|
byte[] needle = { 1, 2, 3 };
|
||||||
|
ByteArraySearcher searcher = new(needle);
|
||||||
|
|
||||||
|
bool result = searcher.Contains(haystack);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Contains__NeedleInMiddle_ReturnsTrue()
|
||||||
|
{
|
||||||
|
byte[] haystack = { 1, 2, 3, 4, 5 };
|
||||||
|
byte[] needle = { 3, 4 };
|
||||||
|
ByteArraySearcher searcher = new(needle);
|
||||||
|
|
||||||
|
bool result = searcher.Contains(haystack);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Contains__NeedleAtEnd_ReturnsTrue()
|
||||||
|
{
|
||||||
|
byte[] haystack = { 1, 2, 3, 4, 5 };
|
||||||
|
byte[] needle = { 4, 5 };
|
||||||
|
ByteArraySearcher searcher = new(needle);
|
||||||
|
|
||||||
|
bool result = searcher.Contains(haystack);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Contains__NeedleNotPresent_ReturnsFalse()
|
||||||
|
{
|
||||||
|
byte[] haystack = { 1, 2, 3, 4, 5 };
|
||||||
|
byte[] needle = { 5, 6, 7 };
|
||||||
|
ByteArraySearcher searcher = new(needle);
|
||||||
|
|
||||||
|
bool result = searcher.Contains(haystack);
|
||||||
|
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
41
CsvLib/ByteArraySearcher.cs
Normal file
41
CsvLib/ByteArraySearcher.cs
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#nullable enable
|
||||||
|
|
||||||
|
namespace CsvLib;
|
||||||
|
|
||||||
|
public class ByteArraySearcher
|
||||||
|
{
|
||||||
|
private readonly byte[] _needle;
|
||||||
|
|
||||||
|
public ByteArraySearcher(byte[] needle)
|
||||||
|
{
|
||||||
|
_needle = needle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(byte[] haystack)
|
||||||
|
{
|
||||||
|
return Contains(haystack, haystack.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(byte[] haystack, int length)
|
||||||
|
{
|
||||||
|
// TODO: Implement the Boyer-Moore algorithm
|
||||||
|
for (int i = 0; i <= length - _needle.Length; i++)
|
||||||
|
{
|
||||||
|
bool found = true;
|
||||||
|
|
||||||
|
for (int j = 0; j < _needle.Length; j++)
|
||||||
|
{
|
||||||
|
if (haystack[i + j] != _needle[j])
|
||||||
|
{
|
||||||
|
found = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user