Skip to content

Commit

Permalink
Removed old ToList optimizations and fixed tests
Browse files Browse the repository at this point in the history
  • Loading branch information
manofstick committed Oct 28, 2020
1 parent c29bc04 commit 9c83288
Show file tree
Hide file tree
Showing 13 changed files with 45 additions and 375 deletions.
2 changes: 1 addition & 1 deletion Benchmark/Cistern.Benchmarks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>Cistern.Benchmarks</RootNamespace>
</PropertyGroup>

Expand Down
2 changes: 1 addition & 1 deletion ValueLinq/Cistern.ValueLinq.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>Cistern.ValueLinq</RootNamespace>
<AssemblyName>Cistern.ValueLinq</AssemblyName>
</PropertyGroup>
Expand Down
68 changes: 0 additions & 68 deletions ValueLinq/Containers/Array.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,34 +42,6 @@ public struct ArrayNode<T>

bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request, out TResult result)
{
if (typeof(TRequest) == typeof(Optimizations.ToList_Select_XXX<T, TOuter>))
{
var toListSelect = (Optimizations.ToList_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ArrayNode.ToList(_array, toListSelect.Map);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_XXX<T>))
{
var toListWhere = (Optimizations.ToList_Where_XXX<T>)(object)request;
result = (TResult)(object)ArrayNode.ToList(_array, toListWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_Select_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Where_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ArrayNode.ToList(_array, toListSelectWhere.Map, toListSelectWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_Where_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Select_Where_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ArrayNode.ToList(_array, toListSelectWhere.Filter, toListSelectWhere.Map);
return true;
}

result = default;
return false;
}
Expand All @@ -88,46 +60,6 @@ public static CreationType Create<T, Head, Tail, CreationType>(T[] array, ref No
return nodes.CreateObject<CreationType, T, ArrayFastEnumerator<T>>(ref enumerator);
}

public static List<U> ToList<T, U>(T[] array, Func<T, U> map)
{
var newList = new List<U>(array.Length);
for (var i = 0; i < array.Length; ++i)
newList.Add(map(array[i]));
return newList;
}

public static List<U> ToList<T, U>(T[] array, Func<T, U> map, Func<U, bool> filter)
{
var newList = new List<U>();
for (var i = 0; i < array.Length; ++i)
{
var mapped = map(array[i]);
if (filter(mapped))
newList.Add(mapped);
}
return newList;
}

public static List<U> ToList<T, U>(T[] array, Func<T, bool> filter, Func<T, U> map)
{
var newList = new List<U>();
for (var i = 0; i < array.Length; ++i)
{
if (filter(array[i]))
newList.Add(map(array[i]));
}
return newList;
}

public static List<T> ToList<T>(T[] array, Func<T, bool> map)
{
var newList = new List<T>();
foreach (var item in array)
if (map(item))
newList.Add(item);
return newList;
}

internal static TResult FastEnumerate<TIn, TResult, FEnumerator>(TIn[] array, FEnumerator fenum)
where FEnumerator : IForwardEnumerator<TIn>
{
Expand Down
19 changes: 7 additions & 12 deletions ValueLinq/Containers/Empty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,6 @@ public struct EmptyNode<T>

bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request, out TResult result)
{
if ((typeof(TRequest) == typeof(Optimizations.ToList_Select_XXX<T, TOuter>))
|| (typeof(TRequest) == typeof(Optimizations.ToList_Where_XXX<T>))
|| (typeof(TRequest) == typeof(Optimizations.ToList_Where_Select_XXX<T, TOuter>))
|| (typeof(TRequest) == typeof(Optimizations.ToList_Select_Where_XXX<T, TOuter>)))
{
result = (TResult)(object)new List<TOuter>();
return true;
}

if (typeof(TRequest) == typeof(Optimizations.Count))
{
result = (TResult)(object)0;
Expand All @@ -42,9 +33,7 @@ bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request,
}

public TResult CreateObjectViaFastEnumerator<TIn, TResult, FEnumerator>(in FEnumerator fenum) where FEnumerator : IForwardEnumerator<TIn>
{
throw new NotImplementedException();
}
=> EmptyNode.FastEnumerate<TIn, TResult, FEnumerator>(fenum);
}

static class EmptyNode
Expand All @@ -56,5 +45,11 @@ public static CreationType Create<T, Head, Tail, CreationType>(ref Nodes<Head, T
var enumerator = new EmptyFastEnumerator<T>();
return nodes.CreateObject<CreationType, T, EmptyFastEnumerator<T>>(ref enumerator);
}

internal static TResult FastEnumerate<TIn, TResult, FEnumerator>(FEnumerator fenum) where FEnumerator : IForwardEnumerator<TIn>
{
fenum.Init(0);
return fenum.GetResult<TResult>();
}
}
}
108 changes: 0 additions & 108 deletions ValueLinq/Containers/IEnumerable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,34 +64,6 @@ bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request,
if (_enumerable is INode node)
return node.CheckForOptimization<TOuter, TRequest, TResult>(in request, out result);

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_XXX<T, TOuter>))
{
var toListSelect = (Optimizations.ToList_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ToList(toListSelect.Map);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_XXX<T>))
{
var toListWhere = (Optimizations.ToList_Where_XXX<T>)(object)request;
result = (TResult)(object)ToList(toListWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_Select_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Where_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ToList(toListSelectWhere.Map, toListSelectWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_Where_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Select_Where_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ToList(toListSelectWhere.Filter, toListSelectWhere.Map);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.Count))
{
result = (TResult)(object)Count();
Expand Down Expand Up @@ -125,46 +97,6 @@ private static int IterateCount(IEnumerable<T> ts)
}
}

private readonly List<TOuter> ToList<TOuter>(Func<T, TOuter> map)
{
return _enumerable switch
{
T[] array => ArrayNode.ToList(array, map),
List<T> list => ListByIndexNode.ToList(list, map),
_ => EnumerableNode.ToList(_enumerable, map),
};
}

private readonly List<TOuter> ToList<TOuter>(Func<T, TOuter> map, Func<TOuter, bool> filter)
{
return _enumerable switch
{
T[] array => ArrayNode.ToList(array, map, filter),
List<T> list => ListByIndexNode.ToList(list, map, filter),
_ => EnumerableNode.ToList(_enumerable, map, filter),
};
}

private readonly List<TOuter> ToList<TOuter>(Func<T, bool> filter, Func<T, TOuter> map)
{
return _enumerable switch
{
T[] array => ArrayNode.ToList(array, filter, map),
List<T> list => ListByIndexNode.ToList(list, filter, map),
_ => EnumerableNode.ToList(_enumerable, filter, map),
};
}

private readonly List<T> ToList(Func<T, bool> filter)
{
return _enumerable switch
{
T[] array => ArrayNode.ToList(array, filter),
List<T> list => ListByIndexNode.ToList(list, filter),
_ => EnumerableNode.ToList(_enumerable, filter),
};
}

TResult INode.CreateObjectViaFastEnumerator<TIn, TResult, FEnumerator>(in FEnumerator fenum) =>
(IEnumerable<TIn>)(object)_enumerable switch
{
Expand All @@ -184,46 +116,6 @@ public static CreationType Create<T, Head, Tail, CreationType>(IEnumerator<T> en
return nodes.CreateObject<CreationType, T, EnumerableFastEnumerator<T>>(ref e);
}

public static List<U> ToList<T,U>(IEnumerable<T> enumerable, Func<T, U> map)
{
var newList = new List<U>();
foreach (var item in enumerable)
newList.Add(map(item));
return newList;
}

public static List<U> ToList<T, U>(IEnumerable<T> enumerable, Func<T, U> map, Func<U, bool> filter)
{
var newList = new List<U>();
foreach (var item in enumerable)
{
var mapped = map(item);
if (filter(mapped))
newList.Add(mapped);
}
return newList;
}

public static List<U> ToList<T, U>(IEnumerable<T> enumerable, Func<T, bool> filter, Func<T, U> map)
{
var newList = new List<U>();
foreach (var item in enumerable)
{
if (filter(item))
newList.Add(map(item));
}
return newList;
}

public static List<T> ToList<T>(IEnumerable<T> enumerable, Func<T, bool> map)
{
var newList = new List<T>();
foreach (var item in enumerable)
if (map(item))
newList.Add(item);
return newList;
}

internal static TResult FastEnumerate<TIn, TResult, FEnumerator>(IEnumerable<TIn> e, FEnumerator fenum) where FEnumerator : IForwardEnumerator<TIn>
{
fenum.Init(null);
Expand Down
31 changes: 0 additions & 31 deletions ValueLinq/Containers/ListByEnumerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,37 +44,6 @@ CreationType INode.CreateObjectAscent<CreationType, EnumeratorElement, Enumerato

bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request, out TResult result)
{
// To me these are somewhat dubious, because we're using the List<T>.Enumerator to track changes to the collection
// yet we're using the indexer here. Anyway, it's the same in System.Linq's version, so there you go

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_XXX<T, TOuter>))
{
var toListSelect = (Optimizations.ToList_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelect.Map);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_XXX<T>))
{
var toListWhere = (Optimizations.ToList_Where_XXX<T>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_Select_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Where_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelectWhere.Map, toListSelectWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_Where_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Select_Where_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelectWhere.Filter, toListSelectWhere.Map);
return true;
}

result = default;
return false;
}
Expand Down
68 changes: 0 additions & 68 deletions ValueLinq/Containers/ListByIndex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,34 +44,6 @@ public struct ListByIndexNode<T>

bool INode.CheckForOptimization<TOuter, TRequest, TResult>(in TRequest request, out TResult result)
{
if (typeof(TRequest) == typeof(Optimizations.ToList_Select_XXX<T, TOuter>))
{
var toListSelect = (Optimizations.ToList_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelect.Map);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_XXX<T>))
{
var toListWhere = (Optimizations.ToList_Where_XXX<T>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Where_Select_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Where_Select_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelectWhere.Map, toListSelectWhere.Filter);
return true;
}

if (typeof(TRequest) == typeof(Optimizations.ToList_Select_Where_XXX<T, TOuter>))
{
var toListSelectWhere = (Optimizations.ToList_Select_Where_XXX<T, TOuter>)(object)request;
result = (TResult)(object)ListByIndexNode.ToList(_list, toListSelectWhere.Filter, toListSelectWhere.Map);
return true;
}

result = default;
return false;
}
Expand All @@ -90,46 +62,6 @@ public static CreationType Create<T, Head, Tail, CreationType>(List<T> list, ref
return nodes.CreateObject<CreationType, T, ListByIndexFastEnumerator<T>>(ref enumerator);
}

public static List<U> ToList<T, U>(List<T> list, Func<T, U> map)
{
var newList = new List<U>(list.Count);
for (var i = 0; i < list.Count; ++i)
newList.Add(map(list[i]));
return newList;
}
public static List<U> ToList<T, U>(List<T> list, Func<T, U> map, Func<U, bool> filter)
{
var newList = new List<U>();
for (var i = 0; i < list.Count; ++i)
{
var mapped = map(list[i]);
if (filter(mapped))
newList.Add(mapped);
}
return newList;
}

public static List<U> ToList<T, U>(List<T> list, Func<T, bool> filter, Func<T, U> map)
{
var newList = new List<U>();
for (var i = 0; i < list.Count; ++i)
{
var item = list[i];
if (filter(item))
newList.Add(map(item));
}
return newList;
}

public static List<T> ToList<T>(List<T> list, Func<T, bool> map)
{
var newList = new List<T>();
for (var i = 0; i < list.Count; ++i)
if (map(list[i]))
newList.Add(list[i]);
return newList;
}

internal static TResult FastEnumerate<TIn, TResult, FEnumerator>(List<TIn> list, FEnumerator fenum)
where FEnumerator : IForwardEnumerator<TIn>
{
Expand Down
Loading

0 comments on commit 9c83288

Please sign in to comment.