diff options
author | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 13:02:25 -0700 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 16:13:41 -0700 |
commit | 17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch) | |
tree | b5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Core/AnimatableKey.cs | |
download | xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2 xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip |
Initial import
Diffstat (limited to 'Xamarin.Forms.Core/AnimatableKey.cs')
-rw-r--r-- | Xamarin.Forms.Core/AnimatableKey.cs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/AnimatableKey.cs b/Xamarin.Forms.Core/AnimatableKey.cs new file mode 100644 index 00000000..2a73ef6d --- /dev/null +++ b/Xamarin.Forms.Core/AnimatableKey.cs @@ -0,0 +1,82 @@ +using System; + +namespace Xamarin.Forms +{ + internal class AnimatableKey + { + public AnimatableKey(IAnimatable animatable, string handle) + { + if (animatable == null) + { + throw new ArgumentNullException(nameof(animatable)); + } + + if (string.IsNullOrEmpty(handle)) + { + throw new ArgumentException("Argument is null or empty", nameof(handle)); + } + + Animatable = new WeakReference<IAnimatable>(animatable); + Handle = handle; + } + + public WeakReference<IAnimatable> Animatable { get; } + + public string Handle { get; } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + if (ReferenceEquals(this, obj)) + { + return true; + } + if (obj.GetType() != GetType()) + { + return false; + } + return Equals((AnimatableKey)obj); + } + + public override int GetHashCode() + { + unchecked + { + IAnimatable target; + if (!Animatable.TryGetTarget(out target)) + { + return Handle?.GetHashCode() ?? 0; + } + + return ((target?.GetHashCode() ?? 0) * 397) ^ (Handle?.GetHashCode() ?? 0); + } + } + + protected bool Equals(AnimatableKey other) + { + if (!string.Equals(Handle, other.Handle)) + { + return false; + } + + IAnimatable thisAnimatable; + + if (!Animatable.TryGetTarget(out thisAnimatable)) + { + return false; + } + + IAnimatable thatAnimatable; + + if (!other.Animatable.TryGetTarget(out thatAnimatable)) + { + return false; + } + + return Equals(thisAnimatable, thatAnimatable); + } + } +}
\ No newline at end of file |