using System.Collections.Generic; namespace Encompass { public abstract class Renderer { internal EntityManager _entityManager; internal ComponentManager _componentManager; internal void AssignEntityManager(EntityManager entityManager) { _entityManager = entityManager; } internal void AssignComponentManager(ComponentManager componentManager) { _componentManager = componentManager; } protected IEnumerable ReadEntities() where TComponent : struct { foreach (var pair in ReadComponentsIncludingEntity()) { yield return pair.Item2; } } protected Entity ReadEntity() where TComponent : struct { return ReadComponentIncludingEntity().Item2; } protected IEnumerable ReadComponents() where TComponent : struct { return _componentManager.GetComponentsByType(); } protected IEnumerable<(TComponent, Entity)> ReadComponentsIncludingEntity() where TComponent : struct { foreach (var (component, id) in _componentManager.GetComponentsIncludingEntity()) { yield return (component, _entityManager.GetEntity(id)); } } protected TComponent ReadComponent() where TComponent : struct { var enumerator = ReadComponents().GetEnumerator(); enumerator.MoveNext(); return enumerator.Current; } protected (TComponent, Entity) ReadComponentIncludingEntity() where TComponent : struct { var enumerator = ReadComponentsIncludingEntity().GetEnumerator(); enumerator.MoveNext(); return enumerator.Current; } protected ref readonly TComponent GetComponent(Entity entity) where TComponent : struct { return ref _componentManager.GetComponentByEntityAndType(entity.ID); } protected bool HasComponent(Entity entity) where TComponent : struct { return _componentManager.EntityHasComponentOfType(entity.ID); } protected bool SomeComponent() where TComponent : struct { return _componentManager.SomeExistingComponent(); } } }