public bool MoveNext()
{
switch (_state)
{
case IteratorState.HaveCurrent:
_state = IteratorState.NeedCurrent;
return(true);
case IteratorState.NeedCurrent:
// Move to next following node which matches
if (!_filter.MoveToFollowing(_navCurrent, _navEnd))
{
// No more nodes unless ending node matches
if (_filter.IsFiltered(_navEnd))
{
_state = IteratorState.NoNext;
return(false);
}
_navCurrent.MoveTo(_navEnd);
_state = IteratorState.NoNext;
}
return(true);
case IteratorState.HaveCurrentNoNext:
_state = IteratorState.NoNext;
return(true);
}
Debug.Assert(_state == IteratorState.NoNext, "Illegal state: " + _state);
return(false);
}