forked from mirror/DotRecast
65 lines
1.3 KiB
C#
65 lines
1.3 KiB
C#
using System.Threading;
|
|
|
|
namespace DotRecast.Core
|
|
{
|
|
public class AtomicInteger
|
|
{
|
|
private volatile int _location;
|
|
|
|
public AtomicInteger() : this(0)
|
|
{
|
|
}
|
|
|
|
public AtomicInteger(int location)
|
|
{
|
|
_location = location;
|
|
}
|
|
|
|
public int IncrementAndGet()
|
|
{
|
|
return Interlocked.Increment(ref _location);
|
|
}
|
|
|
|
public int GetAndIncrement()
|
|
{
|
|
var next = Interlocked.Increment(ref _location);
|
|
return next - 1;
|
|
}
|
|
|
|
|
|
public int DecrementAndGet()
|
|
{
|
|
return Interlocked.Decrement(ref _location);
|
|
}
|
|
|
|
public int Read()
|
|
{
|
|
return _location;
|
|
}
|
|
|
|
public int GetSoft()
|
|
{
|
|
return _location;
|
|
}
|
|
|
|
public int Exchange(int exchange)
|
|
{
|
|
return Interlocked.Exchange(ref _location, exchange);
|
|
}
|
|
|
|
public int Decrease(int value)
|
|
{
|
|
return Interlocked.Add(ref _location, -value);
|
|
}
|
|
|
|
public int CompareExchange(int value, int comparand)
|
|
{
|
|
return Interlocked.CompareExchange(ref _location, value, comparand);
|
|
}
|
|
|
|
public int Add(int value)
|
|
{
|
|
return Interlocked.Add(ref _location, value);
|
|
}
|
|
}
|
|
} |