encompass-cs/encompass-cs/Collections/MessageStore.cs

86 lines
2.7 KiB
C#
Raw Normal View History

2019-12-06 20:01:56 +00:00
using System;
using System.Collections.Generic;
using Encompass.Exceptions;
2019-12-06 20:01:56 +00:00
namespace Encompass
{
internal class MessageStore
{
2020-03-20 07:09:57 +00:00
private readonly Dictionary<Type, TypedMessageStore> _stores = new Dictionary<Type, TypedMessageStore>(512);
2019-12-06 20:01:56 +00:00
private void RegisterMessageType<TMessage>() where TMessage : struct
2019-12-06 20:01:56 +00:00
{
2020-03-20 07:09:57 +00:00
_stores.Add(typeof(TMessage), new TypedMessageStore<TMessage>());
2019-12-06 20:01:56 +00:00
}
private TypedMessageStore<TMessage> Lookup<TMessage>() where TMessage : struct
2019-12-06 20:01:56 +00:00
{
2020-03-20 07:09:57 +00:00
if (!_stores.ContainsKey(typeof(TMessage))) { RegisterMessageType<TMessage>(); }
return _stores[typeof(TMessage)] as TypedMessageStore<TMessage>;
2019-12-06 20:01:56 +00:00
}
public void AddMessage<TMessage>(in TMessage message) where TMessage : struct
2019-12-06 20:01:56 +00:00
{
Lookup<TMessage>().Add(message);
}
public void AddMessage<TMessage>(in TMessage message, double time) where TMessage : struct
2019-12-06 20:01:56 +00:00
{
Lookup<TMessage>().Add(message, time);
}
public void AddMessageIgnoringTimeDilation<TMessage>(in TMessage message, double time) where TMessage : struct
2019-12-06 20:01:56 +00:00
{
Lookup<TMessage>().AddIgnoringTimeDilation(message, time);
}
public ref readonly TMessage First<TMessage>() where TMessage : struct
2019-12-06 20:01:56 +00:00
{
if (!Any<TMessage>()) { throw new NoMessageOfTypeException("No Message of type {0} exists", typeof(TMessage).Name); }
return ref Lookup<TMessage>().First();
2019-12-06 20:01:56 +00:00
}
public ReadOnlySpan<TMessage> All<TMessage>() where TMessage : struct
2019-12-06 20:01:56 +00:00
{
return Lookup<TMessage>().All();
}
public bool Any<TMessage>() where TMessage : struct
2019-12-06 20:01:56 +00:00
{
return Lookup<TMessage>().Any();
}
public IEnumerable<TMessage> WithEntity<TMessage>(int entityID) where TMessage : struct, IHasEntity
{
return Lookup<TMessage>().WithEntity(entityID);
}
public ref readonly TMessage FirstWithEntity<TMessage>(int entityID) where TMessage : struct
2020-03-22 20:53:23 +00:00
{
return ref Lookup<TMessage>().FirstWithEntity(entityID);
}
public bool SomeWithEntity<TMessage>(int entityID) where TMessage : struct, IHasEntity
{
return Lookup<TMessage>().SomeWithEntity(entityID);
}
2019-12-06 20:01:56 +00:00
public void ProcessDelayedMessages(double dilatedDelta, double realtimeDelta)
{
2020-03-20 07:09:57 +00:00
foreach (var store in _stores.Values)
2019-12-06 20:01:56 +00:00
{
store.ProcessDelayedMessages(dilatedDelta, realtimeDelta);
}
}
public void ClearAll()
{
2020-03-20 07:09:57 +00:00
foreach (var store in _stores.Values)
2019-12-06 20:01:56 +00:00
{
store.Clear();
}
}
}
}