60 lines
1.0 KiB
C#
60 lines
1.0 KiB
C#
using System.Threading;
|
|||
|
|
|
||
|
|
namespace Intelix.Helper;
|
||
|
|
|
||
|
|
public struct ConcurrentLong
|
||
|
|
{
|
||
|
|
private long _value;
|
||
|
|
|
||
|
|
public long Value
|
||
|
|
{
|
||
|
|
get
|
||
|
|
{
|
||
|
|
return Interlocked.Read(ref _value);
|
||
|
|
}
|
||
|
|
set
|
||
|
|
{
|
||
|
|
Interlocked.Exchange(ref _value, value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public ConcurrentLong(long initial)
|
||
|
|
{
|
||
|
|
_value = initial;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ConcurrentLong operator ++(ConcurrentLong x)
|
||
|
|
{
|
||
|
|
Interlocked.Increment(ref x._value);
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ConcurrentLong operator --(ConcurrentLong x)
|
||
|
|
{
|
||
|
|
Interlocked.Decrement(ref x._value);
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static implicit operator long(ConcurrentLong x)
|
||
|
|
{
|
||
|
|
return x.Value;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static implicit operator ConcurrentLong(long v)
|
||
|
|
{
|
||
|
|
return new ConcurrentLong(v);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ConcurrentLong operator +(ConcurrentLong x, long y)
|
||
|
|
{
|
||
|
|
Interlocked.Add(ref x._value, y);
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ConcurrentLong operator -(ConcurrentLong x, long y)
|
||
|
|
{
|
||
|
|
Interlocked.Add(ref x._value, -y);
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
}
|