public static void AtomicIntPtrArray()
 {
     IntPtr[] array = { new IntPtr(10) };
     Equal(new IntPtr(11), array.IncrementAndGet(0L));
     Equal(new IntPtr(10), array.DecrementAndGet(0L));
     array.VolatileWrite(0L, new IntPtr(20));
     True(array.CompareAndSet(0L, new IntPtr(20), new IntPtr(30)));
     Equal(new IntPtr(30), array.VolatileRead(0L));
     False(array.CompareAndSet(0L, new IntPtr(20), new IntPtr(50)));
     Equal(new IntPtr(30), array.VolatileRead(0L));
     Equal(new IntPtr(30), array.GetAndAccumulate(0L, new IntPtr(60), (x, y) => x + y.ToInt32()));
     Equal(new IntPtr(90), array.VolatileRead(0L));
     Equal(new IntPtr(10), array.AccumulateAndGet(0L, new IntPtr(80), (x, y) => x - y.ToInt32()));
     Equal(new IntPtr(10), array.VolatileRead(0L));
     Equal(new IntPtr(10), array.GetAndSet(0L, new IntPtr(25)));
     Equal(new IntPtr(25), array.VolatileRead(0L));
     Equal(new IntPtr(42), array.UpdateAndGet(0L, current => new IntPtr(42)));
     Equal(new IntPtr(42), array.GetAndUpdate(0L, current => new IntPtr(52)));
     Equal(new IntPtr(52), array.VolatileRead(0L));
 }
 public static void AtomicDoubleArray()
 {
     double[] array = { 10D };
     Equal(11D, array.IncrementAndGet(0L));
     Equal(10D, array.DecrementAndGet(0L));
     array.VolatileWrite(0L, 20D);
     True(array.CompareAndSet(0L, 20D, 30D));
     Equal(30D, array.VolatileRead(0L));
     False(array.CompareAndSet(0L, 20D, 50D));
     Equal(30D, array.VolatileRead(0L));
     Equal(80D, array.Add(0L, 50D));
     Equal(80D, array.VolatileRead(0L));
     Equal(80D, array.GetAndAccumulate(0L, 10D, (x, y) => x + y));
     Equal(90D, array.VolatileRead(0L));
     Equal(10D, array.AccumulateAndGet(0L, 80D, (x, y) => x - y));
     Equal(10D, array.VolatileRead(0L));
     Equal(10D, array.GetAndSet(0L, 25D));
     Equal(25D, array.VolatileRead(0L));
     Equal(42D, array.UpdateAndGet(0L, current => 42D));
     Equal(42D, array.GetAndUpdate(0L, current => 52D));
     Equal(52D, array.VolatileRead(0L));
 }
 public static void AtomicFloatArray()
 {
     float[] array = { 10F };
     Equal(11F, array.IncrementAndGet(0L));
     Equal(10F, array.DecrementAndGet(0L));
     array.VolatileWrite(0L, 20F);
     True(array.CompareAndSet(0L, 20F, 30F));
     Equal(30F, array.VolatileRead(0L));
     False(array.CompareAndSet(0L, 20F, 50F));
     Equal(30F, array.VolatileRead(0L));
     Equal(80F, array.Add(0L, 50F));
     Equal(80F, array.VolatileRead(0L));
     Equal(80F, array.GetAndAccumulate(0L, 10F, (x, y) => x + y));
     Equal(90F, array.VolatileRead(0L));
     Equal(10F, array.AccumulateAndGet(0L, 80F, (x, y) => x - y));
     Equal(10F, array.VolatileRead(0L));
     Equal(10F, array.GetAndSet(0L, 25F));
     Equal(25F, array.VolatileRead(0L));
     Equal(42F, array.UpdateAndGet(0L, current => 42F));
     Equal(42F, array.GetAndUpdate(0L, current => 52F));
     Equal(52F, array.VolatileRead(0L));
 }
 public static void AtomicLongArray()
 {
     long[] array = { 10L };
     Equal(11L, array.IncrementAndGet(0L));
     Equal(10L, array.DecrementAndGet(0L));
     array.VolatileWrite(0L, 20L);
     True(array.CompareAndSet(0L, 20L, 30L));
     Equal(30L, array.VolatileRead(0L));
     False(array.CompareAndSet(0L, 20L, 50L));
     Equal(30L, array.VolatileRead(0L));
     Equal(80L, array.Add(0L, 50L));
     Equal(80L, array.VolatileRead(0L));
     Equal(80L, array.GetAndAccumulate(0L, 10L, (x, y) => x + y));
     Equal(90L, array.VolatileRead(0L));
     Equal(10L, array.AccumulateAndGet(0L, 80L, (x, y) => x - y));
     Equal(10L, array.VolatileRead(0L));
     Equal(10L, array.GetAndSet(0L, 25L));
     Equal(25L, array.VolatileRead(0L));
     Equal(42L, array.UpdateAndGet(0L, current => 42L));
     Equal(42L, array.GetAndUpdate(0L, current => 52L));
     Equal(52L, array.VolatileRead(0L));
 }
 public static void AtomicIntArray()
 {
     int[] array = { 10 };
     Equal(11, array.IncrementAndGet(0L));
     Equal(10, array.DecrementAndGet(0L));
     array.VolatileWrite(0L, 20);
     True(array.CompareAndSet(0L, 20, 30));
     Equal(30, array.VolatileRead(0L));
     False(array.CompareAndSet(0L, 20, 50));
     Equal(30, array.VolatileRead(0L));
     Equal(80, array.Add(0L, 50));
     Equal(80, array.VolatileRead(0L));
     Equal(80, array.GetAndAccumulate(0L, 10, (x, y) => x + y));
     Equal(90, array.VolatileRead(0L));
     Equal(10, array.AccumulateAndGet(0L, 80, (x, y) => x - y));
     Equal(10, array.VolatileRead(0L));
     Equal(10, array.GetAndSet(0L, 25));
     Equal(25, array.VolatileRead(0L));
     Equal(42, array.UpdateAndGet(0L, current => 42));
     Equal(42, array.GetAndUpdate(0L, current => 52));
     Equal(52, array.VolatileRead(0L));
 }