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