コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
 /// <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);
 }
コード例 #6
0
 /// <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);
 }