summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core/AnimatableKey.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core/AnimatableKey.cs')
-rw-r--r--Xamarin.Forms.Core/AnimatableKey.cs82
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