diff --git a/logic/Preparation/Utility/SafeValue/Atomic.cs b/logic/Preparation/Utility/SafeValue/Atomic.cs
index 5486c4a..6c8d31e 100644
--- a/logic/Preparation/Utility/SafeValue/Atomic.cs
+++ b/logic/Preparation/Utility/SafeValue/Atomic.cs
@@ -33,7 +33,7 @@ namespace Preparation.Utility
}
public override string ToString() => Interlocked.Read(ref v).ToString();
public long Get() => Interlocked.Read(ref v);
- public static implicit operator long(AtomicLong aint) => Interlocked.Read(ref aint.v);
+ public static implicit operator long(AtomicLong along) => Interlocked.Read(ref along.v);
/// 返回操作前的值
public long SetReturnOri(long value) => Interlocked.Exchange(ref v, value);
public long Add(long x) => Interlocked.Add(ref v, x);
@@ -44,24 +44,43 @@ namespace Preparation.Utility
public long CompareExReturnOri(long newV, long compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo);
}
+ public class AtomicDouble
+ {
+ private double v;
+ public AtomicDouble(double x)
+ {
+ v = x;
+ }
+ public override string ToString() => Interlocked.CompareExchange(ref v, -2.0, -2.0).ToString();
+ public double Get() => Interlocked.CompareExchange(ref v, -2.0, -2.0);
+ public static implicit operator double(AtomicDouble adouble) => Interlocked.CompareExchange(ref adouble.v, -2.0, -2.0);
+ /// 返回操作前的值
+ public double SetReturnOri(double value) => Interlocked.Exchange(ref v, value);
+ /// 返回操作前的值
+ public double CompareExReturnOri(double newV, double compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo);
+ }
+
public class AtomicBool
{
- private int v;//v==0为false,v==1为true
+ private int v;//v&1==0为false,v&1==1为true
public AtomicBool(bool x)
{
v = x ? 1 : 0;
}
- public override string ToString() => (Interlocked.CompareExchange(ref v, -2, -2) == 0) ? "false" : "true";
- public bool Get() => (Interlocked.CompareExchange(ref v, -1, -1) != 0);
- public static implicit operator bool(AtomicBool abool) => (Interlocked.CompareExchange(ref abool.v, -1, -1) != 0);
+ public override string ToString() => ((Interlocked.CompareExchange(ref v, -2, -2) & 1) == 0) ? "false" : "true";
+ public bool Get() => ((Interlocked.CompareExchange(ref v, -2, -2) & 1) == 1);
+ public static implicit operator bool(AtomicBool abool) => abool.Get();
/// 返回操作前的值
- public bool SetReturnOri(bool value) => (Interlocked.Exchange(ref v, value ? 1 : 0) != 0);
+ public bool SetReturnOri(bool value) => ((Interlocked.Exchange(ref v, value ? 1 : 0) & 1) == 1);
/// 赋值前的值是否与将赋予的值不相同
public bool TrySet(bool value)
{
- return (Interlocked.CompareExchange(ref v, value ? 1 : 0, value ? 0 : 1) ^ (value ? 1 : 0)) != 0;
+ return ((Interlocked.Exchange(ref v, value ? 1 : 0) & 1) != (value ? 1 : 0));
}
- public bool And(bool x) => Interlocked.And(ref v, x ? 1 : 0) != 0;
- public bool Or(bool x) => Interlocked.Or(ref v, x ? 1 : 0) != 0;
+ public bool And(bool x) => (Interlocked.And(ref v, x ? 1 : 0) & 1) == 1;
+ public bool Or(bool x) => (Interlocked.Or(ref v, x ? 1 : 0) & 1) == 1;
+ /// 返回操作后的值
+ public bool Reverse() => (Interlocked.Increment(ref v) & 1) == 1;
+ public bool Xor(bool x) => (Interlocked.Add(ref v, x ? 1 : 0) & 1) == 1;
}
}
\ No newline at end of file
diff --git a/logic/Preparation/Utility/SafeValue/InTheRange.cs b/logic/Preparation/Utility/SafeValue/InTheRange.cs
index 1437e58..4ef1286 100644
--- a/logic/Preparation/Utility/SafeValue/InTheRange.cs
+++ b/logic/Preparation/Utility/SafeValue/InTheRange.cs
@@ -152,6 +152,19 @@ namespace Preparation.Utility
else v *= mulV;
}
}
+ public void MulV(double mulV)
+ {
+ if (mulV <= 0)
+ {
+ lock (vLock) v = 0;
+ return;
+ }
+ lock (vLock)
+ {
+ if (v > maxV / mulV) v = maxV; //避免溢出
+ else v = (int)(v * mulV);
+ }
+ }
///
/// 应当保证乘数大于0
///
@@ -163,6 +176,17 @@ namespace Preparation.Utility
else v *= mulPositiveV;
}
}
+ ///
+ /// 应当保证乘数大于0
+ ///
+ public void MulPositiveV(double mulPositiveV)
+ {
+ lock (vLock)
+ {
+ if (v > maxV / mulPositiveV) v = maxV; //避免溢出
+ else v = (int)(v * mulPositiveV);
+ }
+ }
/// 返回实际改变量
public int SubV(int subV)
{
@@ -403,6 +427,19 @@ namespace Preparation.Utility
else v *= mulV;
}
}
+ public void MulV(double mulV)
+ {
+ if (mulV <= 0)
+ {
+ lock (vLock) v = 0;
+ return;
+ }
+ lock (vLock)
+ {
+ if (v > maxV / mulV) v = maxV; //避免溢出
+ else v = (long)(v * mulV);
+ }
+ }
///
/// 应当保证乘数大于0
///
@@ -414,6 +451,17 @@ namespace Preparation.Utility
else v *= mulPositiveV;
}
}
+ ///
+ /// 应当保证乘数大于0
+ ///
+ public void MulPositiveV(double mulPositiveV)
+ {
+ lock (vLock)
+ {
+ if (v > maxV / mulPositiveV) v = maxV; //避免溢出
+ else v = (long)(v * mulPositiveV);
+ }
+ }
/// 返回实际改变量
public long SubV(long subV)
{
diff --git a/logic/Preparation/Utility/SafeValue/TimeBased.cs b/logic/Preparation/Utility/SafeValue/TimeBased.cs
index 7f34068..a905953 100644
--- a/logic/Preparation/Utility/SafeValue/TimeBased.cs
+++ b/logic/Preparation/Utility/SafeValue/TimeBased.cs
@@ -321,13 +321,12 @@ namespace Preparation.Utility
}
}*/
+ /*
public class TimeBasedProgressAtVariableSpeed
{
- private long progress = 0;
- private long lastStartT = long.MaxValue;
- private readonly object progressLock = new();
- private long needProgress;
- private double speed;
+ public LongInTheVariableRange progress;
+ public StartTime startTime = new();
+ private speed =1.0;
public TimeBasedProgressAtVariableSpeed(long needProgress, double speed)
{
@@ -491,6 +490,7 @@ namespace Preparation.Utility
return false;
}
}
+ */
///
/// 冷却时间为可变的CDms的bool,不支持查看当前进度,初始为True