File: Base\System\Windows\LocalValueEnumerator.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
using System;
using System.Collections;
using System.Diagnostics;
using MS.Internal.WindowsBase;
 
#pragma warning disable 1634, 1691  // suppressing PreSharp warnings
 
namespace System.Windows
{
    /// <summary>
    ///     Local value enumeration object
    /// </summary>
    /// <remarks>
    ///     Modifying local values (via SetValue or ClearValue) during enumeration
    ///     is unsupported
    /// </remarks>
    public struct LocalValueEnumerator : IEnumerator
    {
        /// <summary>
        /// Overrides Object.GetHashCode
        /// </summary>
        /// <returns>An integer that represents the hashcode for this object</returns>
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
 
        /// <summary>
        ///     Determine equality
        /// </summary>
        public override bool Equals(object obj)
        {
            if(obj is LocalValueEnumerator)
            {
                LocalValueEnumerator other = (LocalValueEnumerator) obj;
 
                return (_count == other._count &&
                        _index == other._index &&
                        _snapshot == other._snapshot);
            }
            else
            {
                // being compared against something that isn't a LocalValueEnumerator.
                return false;
            }
        }
 
        /// <summary>
        ///     Determine equality
        /// </summary>
        public static bool operator ==(LocalValueEnumerator obj1, LocalValueEnumerator obj2)
        {
          return obj1.Equals(obj2);
        }
 
        /// <summary>
        ///     Determine inequality
        /// </summary>
        public static bool operator !=(LocalValueEnumerator obj1, LocalValueEnumerator obj2)
        {
          return !(obj1 == obj2);
        }
        
        /// <summary>
        ///     Get current entry
        /// </summary>
        public LocalValueEntry Current
        {
            get
            {
                if(_index == -1 )
                {
                    #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception
                    throw new InvalidOperationException(SR.Get(SRID.LocalValueEnumerationReset));
                }
 
                if(_index >= Count )
                {
                    #pragma warning suppress 6503 // IEnumerator.Current is documented to throw this exception
                    throw new InvalidOperationException(SR.Get(SRID.LocalValueEnumerationOutOfBounds));
                }
                
                return _snapshot[_index];
            }
        }
 
        /// <summary>
        ///     Get current entry (object reference based)
        /// </summary>
        object IEnumerator.Current
        {
            get { return Current; }
        }
 
        /// <summary>
        ///     Move to the next item in the enumerator
        /// </summary>
        /// <returns>Success of the method</returns>
        public bool MoveNext()
        {
            _index++;
            
            return _index < Count;
        }
 
        /// <summary>
        ///     Reset enumeration
        /// </summary>
        public void Reset()
        {
            _index = -1;
        }
 
        /// <summary>
        ///     Return number of items represented in the collection
        /// </summary>
        public int Count
        {
            get { return _count; }
        }
 
        internal LocalValueEnumerator(LocalValueEntry[] snapshot, int count)
        {
            _index = -1;
            _count = count;
            _snapshot = snapshot;
        }
 
        private int                     _index;
        private LocalValueEntry[]       _snapshot;
        private int                     _count;
    }
 
 
    /// <summary>
    ///     Represents a Property-Value pair for local value enumeration
    /// </summary>
    public struct LocalValueEntry
    {
        /// <summary>
        /// Overrides Object.GetHashCode
        /// </summary>
        /// <returns>An integer that represents the hashcode for this object</returns>
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
 
        /// <summary>
        ///     Determine equality
        /// </summary>
        public override bool Equals(object obj)
        {
            LocalValueEntry other = (LocalValueEntry) obj;
 
            return (_dp == other._dp &&
                    _value == other._value);
        }
 
        /// <summary>
        ///     Determine equality
        /// </summary>
        public static bool operator ==(LocalValueEntry obj1, LocalValueEntry obj2)
        {
          return obj1.Equals(obj2);
        }
        
        /// <summary>
        ///     Determine inequality
        /// </summary>
        public static bool operator !=(LocalValueEntry obj1, LocalValueEntry obj2)
        {
          return !(obj1 == obj2);
        }
 
        /// <summary>
        ///     Dependency property
        /// </summary>
        public DependencyProperty Property
        {
            get { return _dp; }
        }
 
        /// <summary>
        ///     Value of the property
        /// </summary>
        public object Value
        {
            get { return _value; }
        }
 
        internal LocalValueEntry(DependencyProperty dp, object value)
        {
            _dp = dp;
            _value = value;
        }
 
        // Internal here because we need to change these around when building
        //  the snapshot for the LocalValueEnumerator, and we can't make internal
        //  setters when we have public getters.
        internal DependencyProperty _dp;
        internal object _value;
    }
}