implements efficient equality comparators
							parent
							
								
									c0f7ca3dff
								
							
						
					
					
						commit
						c68427eba7
					
				| 
						 | 
				
			
			@ -3,7 +3,7 @@ version: 2.1
 | 
			
		|||
defaults: &defaults
 | 
			
		||||
  working_directory: ~/repo
 | 
			
		||||
  docker:
 | 
			
		||||
    - image: mcr.microsoft.com/dotnet/core/sdk:2.2
 | 
			
		||||
    - image: mcr.microsoft.com/dotnet/core/sdk:3.0
 | 
			
		||||
      environment:
 | 
			
		||||
        DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
 | 
			
		||||
        DOTNET_CLI_TELEMETRY_OPTOUT: 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ using Microsoft.Xna.Framework;
 | 
			
		|||
 | 
			
		||||
namespace MoonTools.Core.Structs
 | 
			
		||||
{
 | 
			
		||||
    public struct Position2D
 | 
			
		||||
    public struct Position2D : System.IEquatable<Position2D>
 | 
			
		||||
    {
 | 
			
		||||
        private Vector2 remainder;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -146,5 +146,37 @@ namespace MoonTools.Core.Structs
 | 
			
		|||
        {
 | 
			
		||||
            return (int)Math.Floor(value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Equals(object other)
 | 
			
		||||
        {
 | 
			
		||||
            if (other is Position2D otherPosition)
 | 
			
		||||
            {
 | 
			
		||||
                return Equals(otherPosition);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool Equals(Position2D other)
 | 
			
		||||
        {
 | 
			
		||||
            return
 | 
			
		||||
                X == other.X &&
 | 
			
		||||
                Y == other.Y;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return X.GetHashCode() ^ Y.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(Position2D a, Position2D b)
 | 
			
		||||
        {
 | 
			
		||||
            return a.Equals(b);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(Position2D a, Position2D b)
 | 
			
		||||
        {
 | 
			
		||||
            return !(a == b);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -58,13 +58,16 @@ namespace MoonTools.Core.Structs
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Transform2D DefaultTransform {
 | 
			
		||||
            get {
 | 
			
		||||
        public static Transform2D DefaultTransform
 | 
			
		||||
        {
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                return _defaultTransform;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Transform2D(Position2D position) {
 | 
			
		||||
        public Transform2D(Position2D position)
 | 
			
		||||
        {
 | 
			
		||||
            _position = position;
 | 
			
		||||
            _rotation = 0f;
 | 
			
		||||
            _scale = new Vector2(1, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +82,8 @@ namespace MoonTools.Core.Structs
 | 
			
		|||
            TransformMatrix = CreateTransformMatrix(_position, _rotation, _scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Transform2D(Position2D position, float rotation) {
 | 
			
		||||
        public Transform2D(Position2D position, float rotation)
 | 
			
		||||
        {
 | 
			
		||||
            _position = position;
 | 
			
		||||
            _rotation = rotation;
 | 
			
		||||
            _scale = new Vector2(1, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -94,27 +98,25 @@ namespace MoonTools.Core.Structs
 | 
			
		|||
            TransformMatrix = CreateTransformMatrix(_position, _rotation, _scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Transform2D(Position2D position, float rotation, Vector2 scale) {
 | 
			
		||||
        public Transform2D(Position2D position, float rotation, Vector2 scale)
 | 
			
		||||
        {
 | 
			
		||||
            _position = position;
 | 
			
		||||
            _rotation = rotation;
 | 
			
		||||
            _scale = scale;
 | 
			
		||||
            TransformMatrix = CreateTransformMatrix(_position, _rotation, _scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Transform2D(Vector2 position, float rotation, Vector2 scale) {
 | 
			
		||||
        public Transform2D(Vector2 position, float rotation, Vector2 scale)
 | 
			
		||||
        {
 | 
			
		||||
            _position = new Position2D(position.X, position.Y);
 | 
			
		||||
            _rotation = rotation;
 | 
			
		||||
            _scale = scale;
 | 
			
		||||
            TransformMatrix = CreateTransformMatrix(_position, _rotation, _scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Transform2D Compose(Transform2D other) {
 | 
			
		||||
            return new Transform2D(Position + other.Position, Rotation + other.Rotation, Scale * other.Scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool Equals(Transform2D other)
 | 
			
		||||
        public Transform2D Compose(Transform2D other)
 | 
			
		||||
        {
 | 
			
		||||
            return TransformMatrix == other.TransformMatrix;
 | 
			
		||||
            return new Transform2D(Position + other.Position, Rotation + other.Rotation, Scale * other.Scale);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static Matrix CreateTransformMatrix(Position2D translation, float rotationDegrees, Vector2 scale)
 | 
			
		||||
| 
						 | 
				
			
			@ -123,5 +125,35 @@ namespace MoonTools.Core.Structs
 | 
			
		|||
                Matrix.CreateRotationZ(Microsoft.Xna.Framework.MathHelper.ToRadians(rotationDegrees)) *
 | 
			
		||||
                Matrix.CreateTranslation(translation.X, translation.Y, 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Equals(Object other)
 | 
			
		||||
        {
 | 
			
		||||
            if (other is Transform2D otherTransform)
 | 
			
		||||
            {
 | 
			
		||||
                return Equals(otherTransform);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool Equals(Transform2D other)
 | 
			
		||||
        {
 | 
			
		||||
            return TransformMatrix == other.TransformMatrix;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return TransformMatrix.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(Transform2D a, Transform2D b)
 | 
			
		||||
        {
 | 
			
		||||
            return a.Equals(b);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(Transform2D a, Transform2D b)
 | 
			
		||||
        {
 | 
			
		||||
            return !(a == b);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,5 +61,41 @@ namespace Tests
 | 
			
		|||
            result.X.Should().BeApproximately(1.2f, 0.01f);
 | 
			
		||||
            result.Y.Should().BeApproximately(6.4f, 0.01f);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void Equals()
 | 
			
		||||
        {
 | 
			
		||||
            var one = new Position2D(5.2f, 4.7f);
 | 
			
		||||
            var two = new Position2D(5.1f, 4.4f);
 | 
			
		||||
 | 
			
		||||
            one.Equals(two).Should().BeTrue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void EqualsOperator()
 | 
			
		||||
        {
 | 
			
		||||
            var one = new Position2D(5.2f, 4.7f);
 | 
			
		||||
            var two = new Position2D(5.1f, 4.4f);
 | 
			
		||||
 | 
			
		||||
            (one == two).Should().BeTrue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void NotEquals()
 | 
			
		||||
        {
 | 
			
		||||
            var one = new Position2D(5.2f, 4.7f);
 | 
			
		||||
            var two = new Position2D(3.1f, 2.4f);
 | 
			
		||||
 | 
			
		||||
            one.Equals(two).Should().BeFalse();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void NotEqualsOperator()
 | 
			
		||||
        {
 | 
			
		||||
            var one = new Position2D(5.2f, 4.7f);
 | 
			
		||||
            var two = new Position2D(3.1f, 2.4f);
 | 
			
		||||
 | 
			
		||||
            (one != two).Should().BeTrue();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <TargetFramework>netcoreapp2.2</TargetFramework>
 | 
			
		||||
    <TargetFramework>netcoreapp3.0</TargetFramework>
 | 
			
		||||
    <IsPackable>false</IsPackable>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,24 @@ namespace Tests
 | 
			
		|||
            transformA.Should().NotBeEquivalentTo(transformB);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void EqualsOperator()
 | 
			
		||||
        {
 | 
			
		||||
            var transformA = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));
 | 
			
		||||
            var transformB = new Transform2D(new Position2D(0, 1), 4f, new Vector2(2, 1));
 | 
			
		||||
 | 
			
		||||
            (transformA == transformB).Should().BeTrue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void NotEqualsOperator()
 | 
			
		||||
        {
 | 
			
		||||
            var transformA = new Transform2D(new Position2D(2, 3));
 | 
			
		||||
            var transformB = new Transform2D(new Position2D(5, 1));
 | 
			
		||||
 | 
			
		||||
            (transformA != transformB).Should().BeTrue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void Compose()
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue