Split GetRef into multiple methods

wip/source-generators
copygirl 2 years ago
parent 1015fa4399
commit a8107a6bf2
  1. 4
      src/gaemstone/ECS/EntityBase.cs
  2. 4
      src/gaemstone/ECS/EntityBuilder.cs
  3. 20
      src/gaemstone/ECS/EntityRef.cs

@ -13,7 +13,9 @@ public abstract class EntityBase<TReturn>
public abstract T Get<T>();
public abstract T? MaybeGet<T>() where T : unmanaged;
public abstract T? MaybeGet<T>(T _ = null!) where T : class;
public abstract ref T GetRef<T>() where T : unmanaged;
public abstract ref T GetMut<T>() where T : unmanaged;
public abstract ref T GetRefOrNull<T>() where T : unmanaged;
public abstract ref T GetRefOrThrow<T>() where T : unmanaged;
public abstract void Modified<T>();
public abstract TReturn Set<T>(in T value) where T : unmanaged;

@ -70,7 +70,9 @@ public class EntityBuilder
public override T Get<T>() => throw new NotSupportedException();
public override T? MaybeGet<T>() => throw new NotSupportedException();
public override T? MaybeGet<T>(T _ = null!) where T : class => throw new NotSupportedException();
public override ref T GetRef<T>() => throw new NotSupportedException();
public override ref T GetMut<T>() => throw new NotSupportedException();
public override ref T GetRefOrNull<T>() => throw new NotSupportedException();
public override ref T GetRefOrThrow<T>() => throw new NotSupportedException();
public override void Modified<T>() => throw new NotImplementedException();
public override EntityBuilder Set<T>(in T value)

@ -81,11 +81,27 @@ public unsafe sealed class EntityRef
return (ptr != null) ? (T)((GCHandle)Unsafe.Read<nint>(ptr)).Target! : null;
}
public override ref T GetRef<T>()
public override ref T GetRefOrNull<T>()
{
var comp = Universe.LookupOrThrow<T>();
var @ref = ecs_ref_init_id(Universe, this, comp);
var ptr = ecs_ref_get_id(Universe, &@ref, comp);
return ref (ptr != null) ? ref Unsafe.AsRef<T>(ptr) : ref Unsafe.NullRef<T>();
}
public override ref T GetRefOrThrow<T>()
{
ref var ptr = ref GetRefOrNull<T>();
if (Unsafe.IsNullRef(ref ptr)) throw new Exception(
$"Component {typeof(T)} not found on {this}");
return ref ptr;
}
public override ref T GetMut<T>()
{
var comp = Universe.LookupOrThrow<T>();
var ptr = ecs_get_mut_id(Universe, this, comp);
if (ptr == null) throw new Exception($"Component {typeof(T)} not found on {this}");
// NOTE: Value is added if it doesn't exist on the entity.
return ref Unsafe.AsRef<T>(ptr);
}

Loading…
Cancel
Save