Skip to content

Commit 9d0091f

Browse files
committed
[Select] Introduce SelectCollection
1 parent 2586cd4 commit 9d0091f

16 files changed

+408
-254
lines changed

src/StructLinq.BCL/List/BCLStructEnumerable.Select.ToList.cs

Lines changed: 0 additions & 65 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using StructLinq.Array;
2+
using StructLinq.Select;
3+
4+
namespace StructLinq.Tests
5+
{
6+
public class RefSelectCollectionTests : AbstractCollectionTests<double,
7+
RefSelectCollection<int, double, ArrayRefEnumerable<int>, ArrayRefStructEnumerator<int>, RefSelectCollectionTests.MultFunction>,
8+
RefSelectEnumerator<int, double, ArrayRefStructEnumerator<int>, RefSelectCollectionTests.MultFunction>>
9+
{
10+
11+
protected override RefSelectCollection<int, double, ArrayRefEnumerable<int>, ArrayRefStructEnumerator<int>, RefSelectCollectionTests.MultFunction> Build(int size)
12+
{
13+
var func = new MultFunction();
14+
var selectEnumerable =
15+
StructEnumerable.Range(-1, size).ToArray().ToRefStructEnumerable().Select(ref func, x=>x, x => x);
16+
return selectEnumerable;
17+
}
18+
19+
public struct MultFunction : IInFunction<int, double>
20+
{
21+
public double Eval(in int element)
22+
{
23+
return element * 2.0;
24+
}
25+
}
26+
}
27+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Linq;
3+
using StructLinq.Range;
4+
using StructLinq.Select;
5+
using Xunit;
6+
7+
namespace StructLinq.Tests
8+
{
9+
public class SelectCollectionFuncTests : AbstractCollectionTests<double,
10+
SelectCollection<int, double, RangeEnumerable, RangeEnumerator>,
11+
SelectEnumerator<int, double, RangeEnumerator>>
12+
{
13+
[Fact]
14+
public void DelegateTest()
15+
{
16+
Func<int, double> selector = x => x * 2.0;
17+
var sys = Enumerable
18+
.Range(-50, 100)
19+
.Select(selector)
20+
.ToArray();
21+
var structEnum = StructEnumerable
22+
.Range(-50, 100)
23+
.Select(selector)
24+
.ToEnumerable()
25+
.ToArray();
26+
Assert.Equal(sys, structEnum);
27+
}
28+
29+
protected override SelectCollection<int, double, RangeEnumerable, RangeEnumerator> Build(int size)
30+
{
31+
var selectEnumerable =
32+
StructEnumerable.Range(-1, size).Select(x=> x * 2.0, x=> x);
33+
return selectEnumerable;
34+
}
35+
36+
}
37+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using System.Linq;
3+
using StructLinq.Range;
4+
using StructLinq.Select;
5+
using Xunit;
6+
7+
namespace StructLinq.Tests
8+
{
9+
public class SelectCollectionTests : AbstractCollectionTests<double,
10+
SelectCollection<int, double, RangeEnumerable, RangeEnumerator, MultFunction>,
11+
SelectEnumerator<int, double, RangeEnumerator, MultFunction>>
12+
{
13+
[Fact]
14+
public void DelegateTest()
15+
{
16+
Func<int, double> selector = x => x * 2.0;
17+
var sys = Enumerable
18+
.Range(-50, 100)
19+
.Select(selector)
20+
.ToArray();
21+
var func = new MultFunction();
22+
var structEnum = StructEnumerable
23+
.Range(-50, 100)
24+
.Select(ref func, x=>x, x=> x)
25+
.ToEnumerable()
26+
.ToArray();
27+
Assert.Equal(sys, structEnum);
28+
}
29+
30+
protected override SelectCollection<int, double, RangeEnumerable, RangeEnumerator, MultFunction> Build(int size)
31+
{
32+
var func = new MultFunction();
33+
var selectEnumerable =
34+
StructEnumerable.Range(-1, size).Select(ref func, x=>x, x => x);
35+
return selectEnumerable;
36+
}
37+
}
38+
}

src/StructLinq.Tests/SelectFuncTests.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,38 @@
22
using System.Linq;
33
using StructLinq.Range;
44
using StructLinq.Select;
5+
using StructLinq.Where;
56
using Xunit;
67

78
namespace StructLinq.Tests
89
{
910
public class SelectFuncTests : AbstractEnumerableTests<double,
10-
SelectEnumerable<int, double, RangeEnumerable, RangeEnumerator>,
11-
SelectEnumerator<int, double, RangeEnumerator>>
11+
SelectEnumerable<int, double, WhereEnumerable<int, IStructEnumerable<int, RangeEnumerator>, RangeEnumerator>, WhereEnumerator<int, RangeEnumerator>>,
12+
SelectEnumerator<int, double, WhereEnumerator<int, RangeEnumerator>>>
1213
{
1314
[Fact]
1415
public void DelegateTest()
1516
{
1617
Func<int, double> selector = x => x * 2.0;
1718
var sys = Enumerable
18-
.Range(-50, 100)
19-
.Select(selector)
20-
.ToArray();
19+
.Range(-50, 100)
20+
.Select(selector)
21+
.ToArray();
2122
var structEnum = StructEnumerable
22-
.Range(-50, 100)
23-
.Select(selector)
24-
.ToEnumerable()
25-
.ToArray();
23+
.Range(-50, 100)
24+
.Select(selector)
25+
.ToEnumerable()
26+
.ToArray();
2627
Assert.Equal(sys, structEnum);
2728
}
2829

29-
protected override SelectEnumerable<int, double, RangeEnumerable, RangeEnumerator> Build(int size)
30+
protected override SelectEnumerable<int, double, WhereEnumerable<int, IStructEnumerable<int, RangeEnumerator>, RangeEnumerator>, WhereEnumerator<int, RangeEnumerator>> Build(int size)
3031
{
3132
var selectEnumerable =
32-
StructEnumerable.Range(-1, size).Select(x=> x * 2.0, x=> x);
33+
StructEnumerable.Range(-1, size).Where(x=> true).Select(x=> x * 2.0, x=> x);
3334
return selectEnumerable;
3435
}
3536

3637
}
38+
3739
}

src/StructLinq.Tests/SelectTests.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,43 @@
22
using System.Linq;
33
using StructLinq.Range;
44
using StructLinq.Select;
5+
using StructLinq.Where;
56
using Xunit;
67

78
namespace StructLinq.Tests
89
{
910
public class SelectTests : AbstractEnumerableTests<double,
10-
SelectEnumerable<int, double, RangeEnumerable, RangeEnumerator, MultFunction>,
11-
SelectEnumerator<int, double, RangeEnumerator, MultFunction>>
11+
SelectEnumerable<int, double, WhereEnumerable<int, IStructEnumerable<int, RangeEnumerator>, RangeEnumerator>, WhereEnumerator<int, RangeEnumerator>, MultFunction>,
12+
SelectEnumerator<int, double, WhereEnumerator<int, RangeEnumerator>, MultFunction>>
1213
{
1314
[Fact]
1415
public void DelegateTest()
1516
{
1617
Func<int, double> selector = x => x * 2.0;
1718
var sys = Enumerable
18-
.Range(-50, 100)
19-
.Select(selector)
20-
.ToArray();
19+
.Range(-50, 100)
20+
.Select(selector)
21+
.ToArray();
2122
var func = new MultFunction();
2223
var structEnum = StructEnumerable
23-
.Range(-50, 100)
24-
.Select(ref func, x=>x, x=> x)
25-
.ToEnumerable()
26-
.ToArray();
24+
.Range(-50, 100)
25+
.Select(ref func, x=>x, x=> x)
26+
.ToEnumerable()
27+
.ToArray();
2728
Assert.Equal(sys, structEnum);
2829
}
2930

30-
protected override SelectEnumerable<int, double, RangeEnumerable, RangeEnumerator, MultFunction> Build(int size)
31+
protected override SelectEnumerable<int, double, WhereEnumerable<int, IStructEnumerable<int, RangeEnumerator>, RangeEnumerator>, WhereEnumerator<int, RangeEnumerator>, MultFunction> Build(int size)
3132
{
3233
var func = new MultFunction();
33-
SelectEnumerable<int, double, RangeEnumerable, RangeEnumerator, MultFunction> selectEnumerable =
34-
StructEnumerable.Range(-1, size).Select(ref func, x=>x, x => x);
34+
var selectEnumerable =
35+
StructEnumerable.Range(-1, size).Where(x=> true).Select(ref func, x=>x, x => x);
3536
return selectEnumerable;
3637
}
3738

3839
}
39-
40+
41+
4042
public struct MultFunction : IFunction<int, double>
4143
{
4244
public double Eval(int element)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Runtime.CompilerServices;
2+
3+
namespace StructLinq.Select
4+
{
5+
public struct RefSelectCollection<TIn, TOut, TEnumerable, TEnumerator, TFunction> : IStructCollection<TOut, RefSelectEnumerator<TIn, TOut, TEnumerator, TFunction>>
6+
where TFunction : struct, IInFunction<TIn, TOut>
7+
where TEnumerator : struct, IRefStructEnumerator<TIn>
8+
where TEnumerable : IRefStructCollection<TIn, TEnumerator>
9+
{
10+
#region private fields
11+
private TFunction function;
12+
private TEnumerable inner;
13+
#endregion
14+
15+
public RefSelectCollection(ref TFunction function, ref TEnumerable inner)
16+
{
17+
this.function = function;
18+
this.inner = inner;
19+
}
20+
21+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
22+
public RefSelectEnumerator<TIn, TOut, TEnumerator, TFunction> GetEnumerator()
23+
{
24+
var typedEnumerator = inner.GetEnumerator();
25+
return new RefSelectEnumerator<TIn, TOut, TEnumerator, TFunction>(ref function, ref typedEnumerator);
26+
}
27+
28+
public int Count
29+
{
30+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
31+
get => inner.Count;
32+
}
33+
34+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
35+
public void Slice(uint start, uint? length)
36+
{
37+
inner.Slice(start, length);
38+
}
39+
40+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
41+
public object Clone()
42+
{
43+
return this;
44+
}
45+
46+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
47+
public TOut Get(int i)
48+
{
49+
return function.Eval(inner.Get(i));
50+
}
51+
52+
}
53+
}

src/StructLinq/Select/RefSelectEnumerable.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,5 @@ public RefSelectEnumerator<TIn, TOut, TEnumerator, TFunction> GetEnumerator()
2424
var typedEnumerator = inner.GetEnumerator();
2525
return new RefSelectEnumerator<TIn, TOut, TEnumerator, TFunction>(ref function, ref typedEnumerator);
2626
}
27-
28-
internal TEnumerable Inner
29-
{
30-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
31-
get => inner;
32-
}
3327
}
3428
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
using StructLinq.Select;
4+
5+
// ReSharper disable once CheckNamespace
6+
namespace StructLinq
7+
{
8+
public static partial class StructEnumerable
9+
{
10+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
11+
public static RefSelectCollection<TIn, TOut, TEnumerable, TEnumerator, TFunction> Select<TIn, TOut, TEnumerable, TEnumerator, TFunction>(
12+
this TEnumerable enumerable,
13+
ref TFunction function,
14+
Func<TEnumerable, IRefStructCollection<TIn, TEnumerator>> _,
15+
Func<TFunction, IInFunction<TIn, TOut>> __)
16+
where TEnumerator : struct, IRefStructEnumerator<TIn>
17+
where TFunction : struct, IInFunction<TIn, TOut>
18+
where TEnumerable : struct, IRefStructCollection<TIn, TEnumerator>
19+
{
20+
return new RefSelectCollection<TIn, TOut, TEnumerable, TEnumerator, TFunction>(ref function, ref enumerable);
21+
}
22+
23+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
24+
public static RefSelectCollection<TIn, TOut, TEnumerable, TEnumerator, StructInFunction<TIn, TOut>> Select<TIn, TOut, TEnumerable, TEnumerator>(
25+
this TEnumerable enumerable,
26+
InFunc<TIn, TOut> function,
27+
Func<TEnumerable, IRefStructCollection<TIn, TEnumerator>> _)
28+
where TEnumerator : struct, IRefStructEnumerator<TIn>
29+
where TEnumerable : struct, IRefStructCollection<TIn, TEnumerator>
30+
{
31+
var fct = function.ToStruct();
32+
return new RefSelectCollection<TIn, TOut, TEnumerable, TEnumerator, StructInFunction<TIn, TOut>>(ref fct, ref enumerable);
33+
}
34+
35+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
36+
public static RefSelectCollection<TIn, TOut, IRefStructCollection<TIn, TEnumerator>, TEnumerator, StructInFunction<TIn, TOut>> Select<TIn, TOut, TEnumerator>(
37+
this IRefStructCollection<TIn, TEnumerator> enumerable,
38+
InFunc<TIn, TOut> function)
39+
where TEnumerator : struct, IRefStructEnumerator<TIn>
40+
{
41+
var fct = function.ToStruct();
42+
return new RefSelectCollection<TIn, TOut, IRefStructCollection<TIn, TEnumerator>, TEnumerator, StructInFunction<TIn, TOut>>(ref fct, ref enumerable);
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)