blob: fd9659df93c974a40c6bdcb65ead7d9844cb4fe5 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml.FormulaParsing.Exceptions;
using OfficeOpenXml.FormulaParsing.Utilities;
namespace OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup
{
public class ArrayLookupNavigator : LookupNavigator
{
private readonly FunctionArgument[] _arrayData;
private int _index = 0;
private object _currentValue;
public ArrayLookupNavigator(LookupDirection direction, LookupArguments arguments, ParsingContext parsingContext)
: base(direction, arguments, parsingContext)
{
Require.That(arguments).Named("arguments").IsNotNull();
Require.That(arguments.DataArray).Named("arguments.DataArray").IsNotNull();
_arrayData = arguments.DataArray.ToArray();
Initialize();
}
private void Initialize()
{
if (Arguments.LookupIndex >= _arrayData.Length)
{
throw new ExcelErrorValueException(eErrorType.Ref);
}
SetCurrentValue();
}
public override int Index
{
get { return _index; }
}
private void SetCurrentValue()
{
_currentValue = _arrayData[_index];
}
private bool HasNext()
{
if (Direction == LookupDirection.Vertical)
{
return _index < (_arrayData.Length - 1);
}
else
{
return false;
}
}
public override bool MoveNext()
{
if (!HasNext()) return false;
if (Direction == LookupDirection.Vertical)
{
_index++;
}
SetCurrentValue();
return true;
}
public override object CurrentValue
{
get { return _arrayData[_index].Value; }
}
public override object GetLookupValue()
{
return _arrayData[_index].Value;
}
}
}