MostlySingletonList.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / IdentityModel / System / IdentityModel / MostlySingletonList.cs / 1305376 / MostlySingletonList.cs

                            //------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------

namespace System.IdentityModel 
{
    using System.Collections.Generic; 
 
    // Embed this struct in a class to represent a field of that class
    // that is logically a list, but contains just one item in all but 
    // the rarest of scenarios.  When this class must be passed around
    // in internal APIs, use it as a ref parameter.
    struct MostlySingletonList where T : class
    { 
        int count;
        T singleton; 
        List list; 

        public T this[int index] 
        {
            get
            {
                if (this.list == null) 
                {
                    EnsureValidSingletonIndex(index); 
                    return this.singleton; 
                }
                else 
                {
                    return this.list[index];
                }
            } 
        }
 
        public int Count 
        {
            get { return this.count; } 
        }

        public void Add(T item)
        { 
            if (this.list == null)
            { 
                if (this.count == 0) 
                {
                    this.singleton = item; 
                    this.count = 1;
                    return;
                }
                this.list = new List(); 
                this.list.Add(this.singleton);
                this.singleton = null; 
            } 
            this.list.Add(item);
            this.count++; 
        }

        static bool Compare(T x, T y)
        { 
            return x == null ? y == null : x.Equals(y);
        } 
 
        public bool Contains(T item)
        { 
            return IndexOf(item) >= 0;
        }

        void EnsureValidSingletonIndex(int index) 
        {
            if (this.count != 1 ) 
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("count", SR.GetString(SR.ValueMustBeOne)));
            } 

            if (index != 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", SR.GetString(SR.ValueMustBeZero))); 
            }
 
        } 

        bool MatchesSingleton(T item) 
        {
            return this.count == 1 && Compare(this.singleton, item);
        }
 
        public int IndexOf(T item)
        { 
            if (this.list == null) 
            {
                return MatchesSingleton(item) ? 0 : -1; 
            }
            else
            {
                return this.list.IndexOf(item); 
            }
        } 
 
        public bool Remove(T item)
        { 
            if (this.list == null)
            {
                if (MatchesSingleton(item))
                { 
                    this.singleton = null;
                    this.count = 0; 
                    return true; 
                }
                else 
                {
                    return false;
                }
            } 
            else
            { 
                bool result = this.list.Remove(item); 
                if (result)
                { 
                    this.count--;
                }
                return result;
            } 
        }
 
        public void RemoveAt(int index) 
        {
            if (this.list == null) 
            {
                EnsureValidSingletonIndex(index);
                this.singleton = null;
                this.count = 0; 
            }
            else 
            { 
                this.list.RemoveAt(index);
                this.count--; 
            }
        }
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------

namespace System.IdentityModel 
{
    using System.Collections.Generic; 
 
    // Embed this struct in a class to represent a field of that class
    // that is logically a list, but contains just one item in all but 
    // the rarest of scenarios.  When this class must be passed around
    // in internal APIs, use it as a ref parameter.
    struct MostlySingletonList where T : class
    { 
        int count;
        T singleton; 
        List list; 

        public T this[int index] 
        {
            get
            {
                if (this.list == null) 
                {
                    EnsureValidSingletonIndex(index); 
                    return this.singleton; 
                }
                else 
                {
                    return this.list[index];
                }
            } 
        }
 
        public int Count 
        {
            get { return this.count; } 
        }

        public void Add(T item)
        { 
            if (this.list == null)
            { 
                if (this.count == 0) 
                {
                    this.singleton = item; 
                    this.count = 1;
                    return;
                }
                this.list = new List(); 
                this.list.Add(this.singleton);
                this.singleton = null; 
            } 
            this.list.Add(item);
            this.count++; 
        }

        static bool Compare(T x, T y)
        { 
            return x == null ? y == null : x.Equals(y);
        } 
 
        public bool Contains(T item)
        { 
            return IndexOf(item) >= 0;
        }

        void EnsureValidSingletonIndex(int index) 
        {
            if (this.count != 1 ) 
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("count", SR.GetString(SR.ValueMustBeOne)));
            } 

            if (index != 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("index", SR.GetString(SR.ValueMustBeZero))); 
            }
 
        } 

        bool MatchesSingleton(T item) 
        {
            return this.count == 1 && Compare(this.singleton, item);
        }
 
        public int IndexOf(T item)
        { 
            if (this.list == null) 
            {
                return MatchesSingleton(item) ? 0 : -1; 
            }
            else
            {
                return this.list.IndexOf(item); 
            }
        } 
 
        public bool Remove(T item)
        { 
            if (this.list == null)
            {
                if (MatchesSingleton(item))
                { 
                    this.singleton = null;
                    this.count = 0; 
                    return true; 
                }
                else 
                {
                    return false;
                }
            } 
            else
            { 
                bool result = this.list.Remove(item); 
                if (result)
                { 
                    this.count--;
                }
                return result;
            } 
        }
 
        public void RemoveAt(int index) 
        {
            if (this.list == null) 
            {
                EnsureValidSingletonIndex(index);
                this.singleton = null;
                this.count = 0; 
            }
            else 
            { 
                this.list.RemoveAt(index);
                this.count--; 
            }
        }
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK