encompass-cs/encompass-cs/Collections/TypedComponentStore.cs

93 lines
2.8 KiB
C#
Raw Normal View History

2019-12-05 22:59:55 +00:00
using System;
using System.Collections.Generic;
namespace Encompass
{
internal abstract class TypedComponentStore
{
public abstract int Count { get; }
public abstract IEnumerable<(int, Type, IComponent)> AllInterfaceTyped();
public abstract bool Has(int entity);
public abstract bool Remove(int entity, int priority);
public abstract void ForceRemove(int entity);
2019-12-05 22:59:55 +00:00
public abstract void Clear();
}
internal class TypedComponentStore<TComponent> : TypedComponentStore where TComponent : struct, IComponent
{
private readonly Dictionary<int, TComponent> store = new Dictionary<int, TComponent>(128);
private readonly Dictionary<int, int> priorities = new Dictionary<int, int>(128);
2019-12-05 22:59:55 +00:00
public override int Count { get => store.Count; }
public TComponent Get(int entityID)
2019-12-05 22:59:55 +00:00
{
if (!store.ContainsKey(entityID)) { throw new Exceptions.NoComponentOfTypeOnEntityException("No component of type {0} exists on Entity with ID {1}", typeof(TComponent), entityID); }
return store[entityID];
2019-12-05 22:59:55 +00:00
}
public void Set(int entityID, TComponent component)
2019-12-05 22:59:55 +00:00
{
store[entityID] = component;
2019-12-05 22:59:55 +00:00
}
public bool Set(int entityID, TComponent component, int priority)
2019-12-05 22:59:55 +00:00
{
if (!priorities.ContainsKey(entityID) || priority < priorities[entityID])
{
store[entityID] = component;
priorities[entityID] = priority;
2019-12-05 22:59:55 +00:00
return true;
}
return false;
}
public override bool Remove(int entityID, int priority)
{
if (!priorities.ContainsKey(entityID) || priority < priorities[entityID])
{
priorities[entityID] = priority;
store.Remove(entityID);
priorities.Remove(entityID);
return true;
}
return false;
}
public override void ForceRemove(int entityID)
{
store.Remove(entityID);
priorities.Remove(entityID);
}
public override bool Has(int entityID)
2019-12-05 22:59:55 +00:00
{
return store.ContainsKey(entityID);
2019-12-05 22:59:55 +00:00
}
public override void Clear()
{
store.Clear();
priorities.Clear();
2019-12-05 22:59:55 +00:00
}
public IEnumerable<(TComponent, int)> All()
2019-12-05 22:59:55 +00:00
{
2019-12-17 04:40:15 +00:00
foreach (var kvp in store)
{
yield return (kvp.Value, kvp.Key);
}
2019-12-05 22:59:55 +00:00
}
public override IEnumerable<(int, Type, IComponent)> AllInterfaceTyped()
2019-12-05 22:59:55 +00:00
{
2019-12-17 04:40:15 +00:00
foreach (var kvp in store)
{
yield return (kvp.Key, typeof(TComponent), (IComponent)kvp.Value);
}
2019-12-05 22:59:55 +00:00
}
}
}