59 lines
2.0 KiB
C#
59 lines
2.0 KiB
C#
using System.Runtime.InteropServices;
|
|
using Parsing.Data;
|
|
|
|
namespace Parsing.Data;
|
|
|
|
public static class DefaultOneDimensionalManipulator
|
|
{
|
|
public static DefaultOneDimensionalManipulator<TDataType> Create<TDataType>(List<TDataType> dataSet) where TDataType : IEquatable<TDataType>
|
|
{
|
|
return new DefaultOneDimensionalManipulator<TDataType>(dataSet);
|
|
}
|
|
}
|
|
|
|
public class DefaultOneDimensionalManipulator<TDataType> : DataSetManipulatorBase<TDataType, TDataType, int> where TDataType : IEquatable<TDataType>
|
|
{
|
|
public DefaultOneDimensionalManipulator(List<TDataType> dataSet) : base(dataSet, new DefaultDataSetIndexer<TDataType>())
|
|
{
|
|
}
|
|
|
|
protected override Direction ValidDirections()
|
|
{
|
|
return (Direction.Left | Direction.Right);
|
|
}
|
|
|
|
public override bool IsValidIndex(IDataIndex<int> queryPosition)
|
|
{
|
|
var index = queryPosition.GetIndices()[0];
|
|
return (index >= 0) && (index < this.dataSet.Count);
|
|
}
|
|
|
|
public override IDataIndex<int> Move(IDataIndex<int> currentPosition, Direction direction)
|
|
{
|
|
switch (direction)
|
|
{
|
|
case Direction.Forward:
|
|
return new DefaultPositionalDataIndex(currentPosition.GetIndices()[0] + 1);
|
|
case Direction.Backward:
|
|
return new DefaultPositionalDataIndex(currentPosition.GetIndices()[0] - 1);
|
|
default:
|
|
throw new ArgumentOutOfRangeException("Direction was not accounted for move for current data set!");
|
|
}
|
|
}
|
|
|
|
public override List<SearchResult<int>> FindInSet(TDataType data)
|
|
{
|
|
var results = new List<SearchResult<int>>();
|
|
|
|
for (int i = 0; i < this.dataSet.Count; i++)
|
|
{
|
|
if (EqualityComparer<TDataType>.Default.Equals(this.dataSet[i], data))
|
|
{
|
|
var singleResult = new SearchResult<int>(new DefaultPositionalDataIndex(i));
|
|
results.Add(singleResult);
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|
|
} |