/// <summary> /// Subtract value from counter and staturate to minimum specified. /// </summary> /// <param name="value">Value to subtract from counter.</param> /// <param name="min">Minumum value of counter.</param> /// <returns></returns> public int SubSat(int value, int min = int.MinValue) { int oldVal; int newVal = *Counter; do { oldVal = newVal; newVal = newVal <= min ? min : math.max(min, newVal - value); newVal = Interlocked.CompareExchange(ref UnsafeUtility.AsRef <int>(Counter), newVal, oldVal); }while (oldVal != newVal && oldVal != min); return(oldVal); }
/// <summary> /// Add value to counter and saturate to maximum specified. /// </summary> /// <param name="value">Value to add to counter.</param> /// <param name="max">Maximum value of counter.</param> /// <returns></returns> public int AddSat(int value, int max = int.MaxValue) { int oldVal; int newVal = *Counter; do { oldVal = newVal; newVal = newVal >= max ? max : math.min(max, newVal + value); newVal = Interlocked.CompareExchange(ref UnsafeUtility.AsRef <int>(Counter), newVal, oldVal); }while (oldVal != newVal && oldVal != max); return(oldVal); }
/// <summary> /// Subtract value from counter and staturate to minimum specified. /// </summary> /// <param name="value">Value to subtract from counter.</param> /// <param name="min">Minumum value of counter.</param> /// <returns></returns> public long SubSat(long value, long min = long.MinValue) { long oldVal; long newVal = *Counter; do { oldVal = newVal; newVal = newVal <= min ? min : math.max(min, newVal - value); newVal = Interlocked.CompareExchange(ref UnsafeUtility.AsRef <long>(Counter), newVal, oldVal); }while (oldVal != newVal && oldVal != min); return(oldVal); }
/// <summary> /// Add value to counter and saturate to maximum specified. /// </summary> /// <param name="value">Value to add to counter.</param> /// <param name="max">Maximum value of counter.</param> /// <returns></returns> public long AddSat(long value, long max = long.MaxValue) { long oldVal; long newVal = *Counter; do { oldVal = newVal; newVal = newVal >= max ? max : math.min(max, newVal + value); newVal = Interlocked.CompareExchange(ref UnsafeUtility.AsRef <long>(Counter), newVal, oldVal); }while (oldVal != newVal && oldVal != max); return(oldVal); }
/// <summary> /// Adds value to counter. /// </summary> /// <param name="value">Value to add to counter.</param> /// <returns></returns> public int Add(int value) { return(Interlocked.Add(ref UnsafeUtility.AsRef <int>(Counter), value) - value); }
/// <summary> /// Adds value to counter. /// </summary> /// <param name="value">Value to add to counter.</param> /// <returns></returns> public long Add(long value) { return(Interlocked.Add(ref UnsafeUtility.AsRef <long>(Counter), value) - value); }