mirror of
https://github.com/DCFApixels/DragonECS-Graphs.git
synced 2025-09-17 19:24:36 +08:00
83 lines
3.0 KiB
C#
83 lines
3.0 KiB
C#
![]() |
#pragma warning disable IDE1006 // Стили именования
|
|||
|
using DCFApixels.DragonECS.Utils;
|
|||
|
using System;
|
|||
|
using System.Runtime.CompilerServices;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
|
|||
|
namespace DCFApixels.DragonECS
|
|||
|
{
|
|||
|
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 8)]
|
|||
|
[Serializable]
|
|||
|
public readonly struct RelationTargets : IEquatable<RelationTargets>
|
|||
|
{
|
|||
|
public static readonly RelationTargets Empty = new RelationTargets();
|
|||
|
|
|||
|
public readonly int entity;
|
|||
|
public readonly int otherEntity;
|
|||
|
|
|||
|
#region Properties
|
|||
|
public int left
|
|||
|
{
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
get => IsInverted ? otherEntity : entity;
|
|||
|
}
|
|||
|
public int right
|
|||
|
{
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
get => IsInverted ? entity : otherEntity;
|
|||
|
}
|
|||
|
|
|||
|
public bool IsInverted
|
|||
|
{
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
get => entity > otherEntity; // направление всегда с меньшего к большему
|
|||
|
}
|
|||
|
public bool IsEmpty
|
|||
|
{
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
get => entity == 0 && otherEntity == 0;
|
|||
|
}
|
|||
|
|
|||
|
public RelationTargets Inverted
|
|||
|
{
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
get => new RelationTargets(otherEntity, entity);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
internal RelationTargets(int entity, int otherEntity)
|
|||
|
{
|
|||
|
this.entity = entity;
|
|||
|
this.otherEntity = otherEntity;
|
|||
|
}
|
|||
|
|
|||
|
#region operators
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
public static RelationTargets operator -(RelationTargets a) => a.Inverted;
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
public static bool operator ==(RelationTargets a, RelationTargets b) => a.entity == b.entity && a.otherEntity == b.otherEntity;
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
public static bool operator !=(RelationTargets a, RelationTargets b) => a.entity != b.entity || a.otherEntity != b.otherEntity;s
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Other
|
|||
|
public override bool Equals(object obj)
|
|||
|
{
|
|||
|
return obj is RelationTargets targets &&
|
|||
|
entity == targets.entity &&
|
|||
|
otherEntity == targets.otherEntity;
|
|||
|
}
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
public bool Equals(RelationTargets other) => this == other;
|
|||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|||
|
public override int GetHashCode() => ~entity ^ otherEntity;
|
|||
|
public override string ToString()
|
|||
|
{
|
|||
|
return IsInverted ?
|
|||
|
$"rel({entity} <- {otherEntity})" :
|
|||
|
$"rel({entity} -> {otherEntity})";
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|