public void SetNextValueTest003()
        {
            List <int> l    = new List <int>();
            var        hack = 0;
            var        a    = InterlockedUtilty.SetNextValue(ref l, 42, (o, a) => {
                o.Add(a);
                if (hack == 0)
                {
                    l = new List <int>()
                    {
                        -1
                    }; hack++;
                }
                return(o);
            }, (o) => {
                l = new List <int>()
                {
                    -2
                }; hack++;
                Assert.Equal(42, o[0]);
            });

            Assert.NotNull(l);
            Assert.Equal(2, hack);
            Assert.Equal(new List <int>()
            {
                -2, 42
            }, l);
        }
        protected void SetResource(T resource)
        {
            if (ReferenceEquals(this._Resource, resource))
            {
                return;
            }
            bool oldResource = (this._Resource is object);
            bool newResource = (resource is object);

            using (var r = this._Resource) {
                this._Resource = resource;
            }
            if (oldResource && !newResource)
            {
                if (InterlockedUtilty.BitwiseSet(ref this._DisposeState, (int)(DisposeState.FinalizeSuppressed)))
                {
                    System.GC.SuppressFinalize(this);
                }
            }
            else if (!oldResource && newResource)
            {
                if (InterlockedUtilty.BitwiseClear(ref this._DisposeState, (int)(DisposeState.FinalizeSuppressed)))
                {
                    System.GC.ReRegisterForFinalize(this);
                }
            }
        }
        public void SetNextValueTest002()
        {
            List <int> l = null;
            var        a = InterlockedUtilty.SetNextValue(ref l, 1, (o, a) => { var r = o ?? new List <int>(); r.Add(a); return(r); }, (o) => Assert.Equal("Cannot", "be"));
            var        b = InterlockedUtilty.SetNextValue(ref l, 2, (o, a) => { var r = o ?? new List <int>(); r.Add(a); return(r); }, (o) => Assert.Equal("Cannot", "be"));

            Assert.NotNull(l);
            Assert.Same(l, a);
            Assert.Same(a, b);
            Assert.Equal(new List <int>()
            {
                1, 2
            }, l);
        }
        public void SetNextValueTest001()
        {
            List <int> l = new List <int>()
            {
                1
            };
            var o = InterlockedUtilty.SetNextValue(ref l, 2, (o, a) => { var r = o ?? new List <int>(); r.Add(a); return(r); }, (v) => Assert.Equal("Cannot", "be"));

            Assert.Same(o, l);
            Assert.Equal(new List <int>()
            {
                1, 2
            }, l);
        }
        protected T ReadResourceAndForget()
        {
            var result = this._Resource;

            if (result is object)
            {
                this._Resource = null;
                if (InterlockedUtilty.BitwiseSet(ref this._DisposeState, (int)(DisposeState.FinalizeSuppressed)))
                {
                    System.GC.SuppressFinalize(this);
                }
            }
            return(result);
        }
 public void Dispose()
 {
     try {
         this.Dispose(disposing: true);
         InterlockedUtilty.BitwiseSet(ref this._DisposeState, (int)(DisposeState.Disposed));
     } catch {
         InterlockedUtilty.BitwiseSet(ref this._DisposeState, (int)(DisposeState.DisposedAndFaulted));
         throw;
     } finally {
         if (InterlockedUtilty.BitwiseSet(ref this._DisposeState, (int)(DisposeState.FinalizeSuppressed)))
         {
             System.GC.SuppressFinalize(this);
         }
     }
 }
 public void BitwiseClearTest()
 {
     {
         int a = 0;
         Assert.False(InterlockedUtilty.BitwiseClear(ref a, 1));
         Assert.Equal(0, a);
     }
     {
         int a = 0;
         Assert.False(InterlockedUtilty.BitwiseClear(ref a, 2));
         Assert.Equal(0, a);
     }
     {
         int b = 1;
         Assert.True(InterlockedUtilty.BitwiseClear(ref b, 1));
         Assert.Equal(0, b);
     }
     {
         int b = 1;
         Assert.False(InterlockedUtilty.BitwiseClear(ref b, 2));
         Assert.Equal(1, b);
     }
 }
 public void BitwiseSetTest()
 {
     {
         int a = 0;
         Assert.True(InterlockedUtilty.BitwiseSet(ref a, 1));
         Assert.Equal(1, a);
     }
     {
         int a = 2;
         Assert.True(InterlockedUtilty.BitwiseSet(ref a, 1));
         Assert.Equal(3, a);
     }
     {
         int b = 1;
         Assert.False(InterlockedUtilty.BitwiseSet(ref b, 1));
         Assert.Equal(1, b);
     }
     {
         int b = 3;
         Assert.False(InterlockedUtilty.BitwiseSet(ref b, 1));
         Assert.Equal(3, b);
     }
 }