DragonECS/src/TableMembers/EcsField.cs

134 lines
3.7 KiB
C#
Raw Normal View History

2023-02-06 01:27:32 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace DCFApixels.DragonECS
{
public readonly struct EcsField<T> : IEcsMemberCachePool<EcsField<T>, T>
{
2023-02-07 17:11:56 +08:00
private readonly EcsPool<T> _pool;
2023-02-06 01:27:32 +08:00
private readonly int _poolID;
2023-02-07 17:11:56 +08:00
public EcsPool<T> Pool => _pool;
2023-02-06 01:27:32 +08:00
public int PoolID => _poolID;
private EcsField(int poolID)
{
_pool = null;
_poolID = poolID;
}
2023-02-07 17:11:56 +08:00
internal EcsField(EcsPool<T> pool)
2023-02-06 01:27:32 +08:00
{
_pool = pool;
_poolID = pool.ID;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public ref T this[int entityID]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => ref _pool[entityID];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-07 17:11:56 +08:00
public bool Has(int entityID)
2023-02-06 01:27:32 +08:00
{
return _pool.Has(entityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-07 17:11:56 +08:00
public ref T Add(int entityID)
2023-02-06 01:27:32 +08:00
{
return ref _pool.Add(entityID);
}
2023-02-07 17:11:56 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Del(int entityID)
{
_pool.Del(entityID);
}
2023-02-06 01:27:32 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static implicit operator EcsField<T>(in int poolID) => new EcsField<T>(poolID);
2023-02-07 17:11:56 +08:00
void IEcsMemberCachePool<EcsField<T>, T>.Inject(out EcsField<T> self, EcsPool<T> pool)
2023-02-06 01:27:32 +08:00
{
self = new EcsField<T>(pool);
}
}
public readonly struct EcsIncField<T> : IEcsMemberCachePool<EcsIncField<T>, T>
{
2023-02-07 17:11:56 +08:00
private readonly EcsPool<T> _pool;
2023-02-06 01:27:32 +08:00
private readonly int _poolID;
2023-02-07 17:11:56 +08:00
public EcsPool<T> Pool => _pool;
2023-02-06 01:27:32 +08:00
public int PoolID => _poolID;
private EcsIncField(int poolID)
{
_pool = null;
_poolID = poolID;
}
2023-02-07 17:11:56 +08:00
internal EcsIncField(EcsPool<T> pool)
2023-02-06 01:27:32 +08:00
{
_pool = pool;
_poolID = pool.ID;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public ref T this[int entityID]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => ref _pool[entityID];
}
2023-02-07 17:11:56 +08:00
[EditorBrowsable(EditorBrowsableState.Never)]
public void Del(int entityID)
{
_pool.Del(entityID);
}
2023-02-06 01:27:32 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static implicit operator EcsIncField<T>(in int poolID) => new EcsIncField<T>(poolID);
2023-02-07 17:11:56 +08:00
void IEcsMemberCachePool<EcsIncField<T>, T>.Inject(out EcsIncField<T> self, EcsPool<T> pool)
2023-02-06 01:27:32 +08:00
{
self = new EcsIncField<T>(pool);
}
}
2023-02-07 17:11:56 +08:00
public struct EcsExcField<T> : IEcsMemberCachePool<EcsExcField<T>, T>
2023-02-06 01:27:32 +08:00
{
2023-02-07 17:11:56 +08:00
private readonly EcsPool<T> _pool;
2023-02-06 01:27:32 +08:00
private readonly int _poolID;
2023-02-07 17:11:56 +08:00
public EcsPool<T> Pool => _pool;
2023-02-06 01:27:32 +08:00
public int PoolID => _poolID;
private EcsExcField(int poolID)
{
2023-02-07 17:11:56 +08:00
_pool = null;
2023-02-06 01:27:32 +08:00
_poolID = poolID;
}
2023-02-07 17:11:56 +08:00
internal EcsExcField(EcsPool<T> pool)
{
_pool = pool;
_poolID = pool.ID;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ref T Add(int entityID)
{
return ref _pool.Add(entityID);
}
2023-02-06 01:27:32 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static implicit operator EcsExcField<T>(in int poolID) => new EcsExcField<T>(poolID);
2023-02-07 17:11:56 +08:00
void IEcsMemberCachePool<EcsExcField<T>, T>.Inject(out EcsExcField<T> self, EcsPool<T> pool)
{
self = new EcsExcField<T>(pool);
}
2023-02-06 01:27:32 +08:00
}
}