using System;
using GlitchyEngine.Math;
using GlitchyEngine.Math.Attributes;

namespace GlitchyEngine.Math;

/// <summary>
/// Represents a vector with two 32-bit signed integer values.
/// </summary>
[Vector(typeof(int), 2, "int")]
[VectorMath]
[VectorLogic]
[ComparableVector]
[VectorCast(typeof(float2), true)]
[VectorCast(typeof(uint2), true)]
public partial struct int2
{
    public static int2 operator ~(int2 value)
    {
        return new int2(~value.X, ~value.Y);
    }
}

/// <summary>
/// Represents a vector with three 32-bit signed integer values.
/// </summary>
[Vector(typeof(int), 3, "int")]
[VectorMath]
[VectorLogic]
[ComparableVector]
[VectorCast(typeof(float3), true)]
[VectorCast(typeof(uint3), true)]
public partial struct int3
{
    public static int3 operator ~(int3 value)
    {
        return new int3(~value.X, ~value.Y, ~value.Z);
    }
}

/// <summary>
/// Represents a vector with four 32-bit signed integer values.
/// </summary>
[Vector(typeof(int), 4, "int")]
[VectorMath]
[VectorLogic]
[ComparableVector]
[VectorCast(typeof(float4), true)]
[VectorCast(typeof(uint4), true)]
public partial struct int4
{
    public static int4 operator ~(int4 value)
    {
        return new int4(~value.X, ~value.Y, ~value.Z, ~value.W);
    }
}
