#if FAT using System; using System.Collections.Generic; namespace LinqInternal.Threading.Needles { [System.Diagnostics.DebuggerNonUserCode] internal class ReadOnlyNeedle : IReadOnlyNeedle, IEquatable> { private readonly INeedle _target; public ReadOnlyNeedle() { _target = null; } public ReadOnlyNeedle(T target) { _target = new StructNeedle(target); } public ReadOnlyNeedle(INeedle target) { _target = target; } public bool IsAlive { get { var target = _target; return _target != null && target.IsAlive; } } public T Value { get { return (T)_target; } } public static explicit operator T(ReadOnlyNeedle needle) { if (needle == null) { throw new ArgumentNullException("needle"); } return needle.Value; } public static implicit operator ReadOnlyNeedle(T field) { return new ReadOnlyNeedle(field); } public static bool operator !=(ReadOnlyNeedle left, ReadOnlyNeedle right) { return NotEqualsExtracted(left, right); } public static bool operator ==(ReadOnlyNeedle left, ReadOnlyNeedle right) { return EqualsExtracted(left, right); } public override bool Equals(object obj) { return (obj is ReadOnlyNeedle) ? EqualsExtracted(this, (ReadOnlyNeedle)obj) : _target.Equals(obj); } public bool Equals(ReadOnlyNeedle other) { return EqualsExtracted(this, other); } public override int GetHashCode() { return EqualityComparer.Default.GetHashCode((T)_target); } public override string ToString() { return Value.ToString(); } private static bool EqualsExtracted(ReadOnlyNeedle left, ReadOnlyNeedle right) { if (left == null) { return right == null; } return left._target.Equals(right._target); } private static bool NotEqualsExtracted(ReadOnlyNeedle left, ReadOnlyNeedle right) { if (left == null) { return right != null; } return !left._target.Equals(right._target); } } } #endif