#if FAT
namespace LinqInternal.Threading
{
///
/// Provides a mechanism to get an object that represents a version of a mutable resource
///
internal sealed partial class VersionProvider
{
private Target _target;
private Advancer _tryAdvance;
///
/// Creates a new VersionProvider
///
public VersionProvider()
{
_target = new Target(out _tryAdvance);
}
internal delegate bool Advancer(out long number);
///
/// Advances the current up to date version
///
public void Advance()
{
long number;
if (!_tryAdvance.Invoke(out number))
{
_target = new Target(out _tryAdvance);
}
}
///
/// Advances the current up to date version and returns a VersionToken for the new version
///
/// A VersionToken representing the advanced version
public VersionToken AdvanceNewToken()
{
long number;
if (!_tryAdvance.Invoke(out number))
{
_target = new Target(out _tryAdvance);
}
return new VersionToken(this, _target, number);
}
///
/// Creates a new VersionToken, it should be considered to be out of date
///
/// A new VersionToken
public VersionToken NewToken()
{
return new VersionToken(this);
}
}
}
#endif