Added possibilities to use IEnumerable<T> and ICollection<T> to create an array.
Closes: thorsten/ExaArray#1 thorsten/ExaArray#3 thorsten/ExaArray#4
This commit is contained in:
parent
d2ae4895c4
commit
0968edab80
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Exa
|
namespace Exa
|
||||||
{
|
{
|
||||||
@ -184,5 +185,81 @@ namespace Exa
|
|||||||
} while (leftOverTotal > 0);
|
} while (leftOverTotal > 0);
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from an enumerable sequence of items. The number of items in the sequence is __unknown__.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This factory method is slow because the number of items in the sequence is unknown. When you know the
|
||||||
|
/// number of items, you should use another factory method, where the number of items can be provided.
|
||||||
|
///
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="sequence">The sequence to consume in order to create the array.</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> CreateFrom(IEnumerable<T> sequence, Strategy strategy = Strategy.MAX_PERFORMANCE)
|
||||||
|
{
|
||||||
|
var inst = new ExaArray1D<T>(strategy);
|
||||||
|
ulong position = 0;
|
||||||
|
foreach (var element in sequence)
|
||||||
|
{
|
||||||
|
inst.Extend();
|
||||||
|
inst[position++] = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from an enumerable sequence of items. The number of items in the sequence is __known__.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Creates an array with <c>length</c> items. When the sequence contains less elements, the remaining values are <c>default(T)</c>.
|
||||||
|
/// When the sequence contains more elements, these additional elements getting ignored.
|
||||||
|
///
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="sequence">The sequence to consume in order to create the array.</param>
|
||||||
|
/// <param name="length">The number of elements in the sequence. When the sequence contains more elements, these additional elements are ignored.</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> CreateFrom(IEnumerable<T> sequence, ulong length, Strategy strategy = Strategy.MAX_PERFORMANCE)
|
||||||
|
{
|
||||||
|
var inst = new ExaArray1D<T>(strategy);
|
||||||
|
inst.Extend(length);
|
||||||
|
|
||||||
|
ulong position = 0;
|
||||||
|
foreach (var element in sequence)
|
||||||
|
{
|
||||||
|
if(position == length)
|
||||||
|
break;
|
||||||
|
|
||||||
|
inst[position++] = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from a collection of items.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="collection">The collection to use</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> CreateFrom(ICollection<T> collection, Strategy strategy = Strategy.MAX_PERFORMANCE)
|
||||||
|
{
|
||||||
|
var inst = new ExaArray1D<T>(strategy);
|
||||||
|
inst.Extend((ulong) collection.Count);
|
||||||
|
|
||||||
|
ulong position = 0;
|
||||||
|
foreach (var element in collection)
|
||||||
|
inst[position++] = element;
|
||||||
|
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
50
ExaArray/Extensions.Framework.cs
Normal file
50
ExaArray/Extensions.Framework.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Exa
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Contains extension methods.
|
||||||
|
/// </summary>
|
||||||
|
public static class ExtensionsFramework
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from this collection of items.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="collection">The collection to use</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> AsExaArray<T>(this ICollection<T> collection, Strategy strategy = Strategy.MAX_PERFORMANCE) => ExaArray1D<T>.CreateFrom(collection, strategy);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from this enumerable sequence of items. The number of items in the sequence is __known__.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Creates an array with <c>length</c> items. When this sequence contains less elements, the remaining values are <c>default(T)</c>.
|
||||||
|
/// When the sequence contains more elements, these additional elements getting ignored.
|
||||||
|
///
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="sequence">The sequence to consume in order to create the array.</param>
|
||||||
|
/// <param name="length">The number of elements in the sequence. When the sequence contains more elements, these additional elements are ignored.</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> AsExaArray<T>(this IEnumerable<T> sequence, ulong length, Strategy strategy = Strategy.MAX_PERFORMANCE) => ExaArray1D<T>.CreateFrom(sequence, length, strategy);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new ExaArray1D from this enumerable sequence of items. The number of items in the sequence is __unknown__.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method is slow because the number of items in this sequence is unknown. When you know the
|
||||||
|
/// number of items, you should use another factory method, where the number of items can be provided.
|
||||||
|
///
|
||||||
|
/// Performance: O(n)
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="sequence">The sequence to consume in order to create the array.</param>
|
||||||
|
/// <param name="strategy">The optional optimization strategy.</param>
|
||||||
|
/// <returns>The desired instance</returns>
|
||||||
|
public static ExaArray1D<T> AsExaArray<T>(this IEnumerable<T> sequence, Strategy strategy = Strategy.MAX_PERFORMANCE) => ExaArray1D<T>.CreateFrom(sequence, strategy);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -550,6 +551,111 @@ namespace ExaArrayTests
|
|||||||
Assert.That(next4.Length, Is.EqualTo(exPerf.Length));
|
Assert.That(next4.Length, Is.EqualTo(exPerf.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Category("normal")]
|
||||||
|
[Category("cover")]
|
||||||
|
public void CreateFromSequence001()
|
||||||
|
{
|
||||||
|
var list = new List<int>
|
||||||
|
{
|
||||||
|
5,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
10,
|
||||||
|
16,
|
||||||
|
};
|
||||||
|
|
||||||
|
var exPerf1 = list.AsExaArray();
|
||||||
|
Assert.That(exPerf1.OptimizationStrategy, Is.EqualTo(Strategy.MAX_PERFORMANCE));
|
||||||
|
Assert.That(exPerf1.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf1.Items(), Is.EquivalentTo(list));
|
||||||
|
|
||||||
|
var exPerf2 = list.AsExaArray(Strategy.MAX_ELEMENTS);
|
||||||
|
Assert.That(exPerf2.OptimizationStrategy, Is.EqualTo(Strategy.MAX_ELEMENTS));
|
||||||
|
Assert.That(exPerf2.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf2.Items(), Is.EquivalentTo(list));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Category("normal")]
|
||||||
|
[Category("cover")]
|
||||||
|
public void CreateFromSequence002()
|
||||||
|
{
|
||||||
|
var array = new int[]
|
||||||
|
{
|
||||||
|
5,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
10,
|
||||||
|
16,
|
||||||
|
};
|
||||||
|
|
||||||
|
var exPerf1 = array.AsExaArray();
|
||||||
|
Assert.That(exPerf1.OptimizationStrategy, Is.EqualTo(Strategy.MAX_PERFORMANCE));
|
||||||
|
Assert.That(exPerf1.Length, Is.EqualTo(array.Length));
|
||||||
|
Assert.That(exPerf1.Items(), Is.EquivalentTo(array));
|
||||||
|
|
||||||
|
var exPerf2 = array.AsExaArray(Strategy.MAX_ELEMENTS);
|
||||||
|
Assert.That(exPerf2.OptimizationStrategy, Is.EqualTo(Strategy.MAX_ELEMENTS));
|
||||||
|
Assert.That(exPerf2.Length, Is.EqualTo(array.Length));
|
||||||
|
Assert.That(exPerf2.Items(), Is.EquivalentTo(array));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Category("normal")]
|
||||||
|
[Category("cover")]
|
||||||
|
public void CreateFromSequence003()
|
||||||
|
{
|
||||||
|
var list = new List<int>
|
||||||
|
{
|
||||||
|
5,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
10,
|
||||||
|
16,
|
||||||
|
};
|
||||||
|
|
||||||
|
var exPerf1 = list.AsEnumerable().AsExaArray();
|
||||||
|
Assert.That(exPerf1.OptimizationStrategy, Is.EqualTo(Strategy.MAX_PERFORMANCE));
|
||||||
|
Assert.That(exPerf1.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf1.Items(), Is.EquivalentTo(list));
|
||||||
|
|
||||||
|
var exPerf2 = list.AsEnumerable().AsExaArray(Strategy.MAX_ELEMENTS);
|
||||||
|
Assert.That(exPerf2.OptimizationStrategy, Is.EqualTo(Strategy.MAX_ELEMENTS));
|
||||||
|
Assert.That(exPerf2.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf2.Items(), Is.EquivalentTo(list));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Category("normal")]
|
||||||
|
[Category("cover")]
|
||||||
|
public void CreateFromSequence004()
|
||||||
|
{
|
||||||
|
var list = new List<int>
|
||||||
|
{
|
||||||
|
5,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
10,
|
||||||
|
16,
|
||||||
|
};
|
||||||
|
|
||||||
|
var exPerf1 = list.AsEnumerable().AsExaArray((ulong) list.Count);
|
||||||
|
Assert.That(exPerf1.OptimizationStrategy, Is.EqualTo(Strategy.MAX_PERFORMANCE));
|
||||||
|
Assert.That(exPerf1.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf1.Items(), Is.EquivalentTo(list));
|
||||||
|
|
||||||
|
var exPerf2 = list.AsEnumerable().AsExaArray((ulong) list.Count, Strategy.MAX_ELEMENTS);
|
||||||
|
Assert.That(exPerf2.OptimizationStrategy, Is.EqualTo(Strategy.MAX_ELEMENTS));
|
||||||
|
Assert.That(exPerf2.Length, Is.EqualTo(list.Count));
|
||||||
|
Assert.That(exPerf2.Items(), Is.EquivalentTo(list));
|
||||||
|
|
||||||
|
var exPerf3 = list.AsEnumerable().AsExaArray(3);
|
||||||
|
Assert.That(exPerf3.OptimizationStrategy, Is.EqualTo(Strategy.MAX_PERFORMANCE));
|
||||||
|
Assert.That(exPerf3.Length, Is.EqualTo(3));
|
||||||
|
Assert.That(exPerf3.Items(), Is.EquivalentTo(new int[] {5,7,8}));
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Category("intensive")]
|
[Category("intensive")]
|
||||||
public void Adding5Billion01()
|
public void Adding5Billion01()
|
||||||
|
Loading…
Reference in New Issue
Block a user