-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathSpanExtensions.cs
More file actions
63 lines (51 loc) · 2.43 KB
/
SpanExtensions.cs
File metadata and controls
63 lines (51 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Buffers;
using System.Collections.Generic;
namespace NetFabric.Hyperlinq.UnitTests
{
static class SpanExtensions
{
public static bool SequenceEqual<T>(this IMemoryOwner<T> first, IEnumerable<T> second, IEqualityComparer<T>? comparer = default)
=> SequenceEqual((ReadOnlySpan<T>)first.Memory.Span, second, comparer);
public static bool SequenceEqual<T>(this Memory<T> first, IEnumerable<T> second, IEqualityComparer<T>? comparer = default)
=> SequenceEqual((ReadOnlySpan<T>)first.Span, second, comparer);
public static bool SequenceEqual<T>(this ReadOnlyMemory<T> first, IEnumerable<T> second, IEqualityComparer<T>? comparer = default)
=> SequenceEqual(first.Span, second, comparer);
public static bool SequenceEqual<T>(this Span<T> first, IEnumerable<T> second, IEqualityComparer<T>? comparer = default)
=> SequenceEqual((ReadOnlySpan<T>)first, second, comparer);
public static bool SequenceEqual<T>(this ReadOnlySpan<T> first, IEnumerable<T> second, IEqualityComparer<T>? comparer = default)
{
if (Utils.IsValueType<T>() && comparer.UseDefaultComparer())
{
using var enumerator = second.GetEnumerator();
for (var index = 0; true; index++)
{
var resultEnded = index == first.Length;
var expectedEnded = !enumerator.MoveNext();
if (resultEnded != expectedEnded)
return false;
if (resultEnded)
return true;
if (!EqualityComparer<T>.Default.Equals(first[index], enumerator.Current))
return false;
}
}
else
{
comparer ??= EqualityComparer<T>.Default;
using var enumerator = second.GetEnumerator();
for (var index = 0; true; index++)
{
var resultEnded = index == first.Length;
var expectedEnded = !enumerator.MoveNext();
if (resultEnded != expectedEnded)
return false;
if (resultEnded)
return true;
if (!comparer.Equals(first[index], enumerator.Current))
return false;
}
}
}
}
}