Files
TextParser/TextParser/Data/DefaultOneDimensionalManipulator.cs

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;
}
}