using System; using Svelto.DataStructures; using Svelto.ECS.Internal; namespace Svelto.ECS { public ref struct EntityStructInitializer { public EntityStructInitializer(EGID id, FasterDictionary, ITypeSafeDictionary> group) { _group = group; _ID = id; } public void Init(T initializer) where T : struct, IEntityStruct { if (_group.TryGetValue(new RefWrapper(EntityBuilder.ENTITY_VIEW_TYPE), out var typeSafeDictionary) == false) return; var dictionary = (TypeSafeDictionary) typeSafeDictionary; if (EntityBuilder.HAS_EGID) SetEGIDWithoutBoxing.SetIDWithoutBoxing(ref initializer, _ID); if (dictionary.TryFindIndex(_ID.entityID, out var findElementIndex)) dictionary.GetDirectValue(findElementIndex) = initializer; } public void CopyFrom(T initializer) where T : struct, IEntityStruct { var dictionary = (TypeSafeDictionary) _group[new RefWrapper(EntityBuilder.ENTITY_VIEW_TYPE)]; if (EntityBuilder.HAS_EGID) SetEGIDWithoutBoxing.SetIDWithoutBoxing(ref initializer, _ID); dictionary[_ID.entityID] = initializer; } public ref T GetOrCreate() where T : struct, IEntityStruct { ref var entityDictionary = ref _group.GetOrCreate(new RefWrapper(EntityBuilder.ENTITY_VIEW_TYPE) , () => new TypeSafeDictionary()); var dictionary = (TypeSafeDictionary) entityDictionary; return ref dictionary.GetOrCreate(_ID.entityID); } public T Get() where T : struct, IEntityStruct { return (_group[new RefWrapper(EntityBuilder.ENTITY_VIEW_TYPE)] as TypeSafeDictionary)[_ID.entityID]; } public bool Has() where T : struct, IEntityStruct { if (_group.TryGetValue(new RefWrapper(EntityBuilder.ENTITY_VIEW_TYPE), out var typeSafeDictionary)) { var dictionary = (TypeSafeDictionary) typeSafeDictionary; if (dictionary.ContainsKey(_ID.entityID)) return true; } return false; } public static EntityStructInitializer CreateEmptyInitializer() { return new EntityStructInitializer(new EGID(), new FasterDictionary, ITypeSafeDictionary>()); } readonly EGID _ID; readonly FasterDictionary, ITypeSafeDictionary> _group; } }