using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.AccessControl;
using System.Text;
namespace Apewer
{
///
public sealed class Enumerator : IEnumerator, IEnumerator, IDisposable
{
// 类的状态
bool _disposed = false;
string _type;
// 元素获取
Func> _getter = null;
// 迭代器
int _index = 0;
T _current = default;
#region IDisposable
///
public void Dispose()
{
_disposed = true;
}
#endregion
#region IEnumerator
///
public T Current
{
get
{
if (_disposed) throw new ObjectDisposedException(_type);
return _current;
}
}
#endregion
#region IEnumerator
///
object IEnumerator.Current { get => Current; }
///
public bool MoveNext()
{
if (_disposed) throw new ObjectDisposedException(_type);
var value = _getter(_index);
if (value == null) return false;
_current = value.Value;
_index++;
return true;
}
///
public void Reset()
{
if (_disposed) throw new ObjectDisposedException(_type);
_current = default;
_index = 0;
}
#endregion
/// 创建枚举器实例。
/// 元素获取程序。传入参数为索引值,从 0 开始;枚举结束后应返回 NULL 值。
///
public Enumerator(Func> getter)
{
if (getter == null) throw new ArgumentNullException(nameof(getter));
_getter = getter;
_type = GetType().Name;
Reset();
}
}
}