encompass-cs/encompass-cs/Collections/TypedMessageStore.cs

111 lines
3.4 KiB
C#
Raw Normal View History

2019-12-06 20:01:56 +00:00
using System.Collections.Generic;
namespace Encompass
{
internal abstract class TypedMessageStore
{
public abstract void ProcessDelayedMessages(double dilatedDelta, double realtimeDelta);
public abstract void Clear();
}
internal class TypedMessageStore<TMessage> : TypedMessageStore where TMessage : struct, IMessage
{
2020-03-20 07:09:57 +00:00
private readonly List<TMessage> _store = new List<TMessage>(128);
private readonly List<(TMessage, double)> _delayedStore = new List<(TMessage, double)>(128);
private readonly List<(TMessage, double)> _delayedStoreIgnoringTimeDilation = new List<(TMessage, double)>(128);
private readonly Dictionary<int, List<TMessage>> _entityToMessage = new Dictionary<int, List<TMessage>>();
2019-12-06 20:01:56 +00:00
public override void ProcessDelayedMessages(double dilatedDelta, double realtimeDelta)
{
2020-03-20 07:09:57 +00:00
for (var i = _delayedStore.Count - 1; i >= 0; i--)
2019-12-06 20:01:56 +00:00
{
2020-03-20 07:09:57 +00:00
var (message, time) = _delayedStore[i];
2019-12-06 20:01:56 +00:00
var updatedTime = time - dilatedDelta;
if (updatedTime <= 0)
{
Add(message);
2020-03-20 07:09:57 +00:00
_delayedStore.RemoveAt(i);
2019-12-06 20:01:56 +00:00
}
else
{
2020-03-20 07:09:57 +00:00
_delayedStore[i] = (message, updatedTime);
2019-12-06 20:01:56 +00:00
}
}
2020-03-20 07:09:57 +00:00
for (var i = _delayedStoreIgnoringTimeDilation.Count - 1; i >= 0; i--)
2019-12-06 20:01:56 +00:00
{
2020-03-20 07:09:57 +00:00
var (message, time) = _delayedStoreIgnoringTimeDilation[i];
2019-12-06 20:01:56 +00:00
var updatedTime = time - realtimeDelta;
if (updatedTime <= 0)
{
Add(message);
2020-03-20 07:09:57 +00:00
_delayedStoreIgnoringTimeDilation.RemoveAt(i);
2019-12-06 20:01:56 +00:00
}
else
{
2020-03-20 07:09:57 +00:00
_delayedStoreIgnoringTimeDilation[i] = (message, updatedTime);
2019-12-06 20:01:56 +00:00
}
}
}
public void Add(TMessage message)
{
2020-03-20 07:09:57 +00:00
_store.Add(message);
if (message is IHasEntity entityMessage)
{
var entityID = entityMessage.Entity.ID;
2020-03-20 07:09:57 +00:00
if (!_entityToMessage.ContainsKey(entityID)) { _entityToMessage.Add(entityID, new List<TMessage>()); }
_entityToMessage[entityID].Add(message);
}
2019-12-06 20:01:56 +00:00
}
public void Add(TMessage message, double time)
{
2020-03-20 07:09:57 +00:00
_delayedStore.Add((message, time));
2019-12-06 20:01:56 +00:00
}
public void AddIgnoringTimeDilation(TMessage message, double time)
{
2020-03-20 07:09:57 +00:00
_delayedStoreIgnoringTimeDilation.Add((message, time));
2019-12-06 20:01:56 +00:00
}
public TMessage First()
{
2020-03-20 07:09:57 +00:00
return _store[0];
2019-12-06 20:01:56 +00:00
}
public bool Any()
{
2020-03-20 07:09:57 +00:00
return _store.Count > 0;
2019-12-06 20:01:56 +00:00
}
public IEnumerable<TMessage> All()
{
2020-03-20 07:09:57 +00:00
return _store;
2019-12-06 20:01:56 +00:00
}
public IEnumerable<TMessage> WithEntity(int entityID)
{
2020-03-20 07:09:57 +00:00
return _entityToMessage.ContainsKey(entityID) ? _entityToMessage[entityID] : System.Linq.Enumerable.Empty<TMessage>();
}
public bool SomeWithEntity(int entityID)
{
2020-03-20 07:09:57 +00:00
return _entityToMessage.ContainsKey(entityID) && _entityToMessage[entityID].Count > 0;
}
2019-12-06 20:01:56 +00:00
public override void Clear()
{
2020-03-20 07:09:57 +00:00
_store.Clear();
foreach (var set in _entityToMessage.Values)
{
set.Clear();
}
2019-12-06 20:01:56 +00:00
}
}
}