< Summary

Class:InternalECSComponent[T]
Assembly:ECS7Plugin.InternalECSComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/InternalECSComponents/InternalECSComponent.cs
Covered lines:73
Uncovered lines:3
Coverable lines:76
Total lines:191
Line coverage:96% (73 of 76)
Covered branches:0
Total branches:0
Covered methods:17
Total methods:18
Method coverage:94.4% (17 of 18)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
DirtyData(...)0%110100%
InternalECSComponent(...)0%220100%
Dispose()0%110100%
PutFor(...)0%110100%
PutFor(...)0%110100%
PutFor(...)0%220100%
RemoveFor(...)0%110100%
RemoveFor(...)0%110100%
RemoveFor(...)0%2.032080%
RemoveFor(...)0%110100%
RemoveFor(...)0%110100%
RemoveFor(...)0%2.032080%
GetFor(...)0%110100%
GetFor(...)0%330100%
GetForAll()0%110100%
MarkDirtyComponentData()0%330100%
ResetDirtyComponentData()0%440100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/InternalECSComponents/InternalECSComponent.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.CRDT;
 3using DCL.ECS7.InternalComponents;
 4using DCL.ECSRuntime;
 5using DCL.Models;
 6using System;
 7using System.Collections.Generic;
 8
 9public class InternalECSComponent<T> : IInternalECSComponent<T> where T: struct, IInternalComponent
 10{
 11    internal readonly struct DirtyData
 12    {
 13        public readonly T Data;
 14        public readonly bool IsDelayedRemoval;
 15
 16        public DirtyData(T data, bool isDelayedRemoval)
 17        {
 112218            Data = data;
 112219            IsDelayedRemoval = isDelayedRemoval;
 112220        }
 21    }
 22
 23    private readonly ECSComponentsFactory componentsFactory;
 24    private readonly int componentId;
 25    private readonly ECSComponent<T> component;
 26    private readonly IReadOnlyDictionary<int, ICRDTExecutor> crdtExecutors;
 27    private readonly IComponentDirtySystem dirtySystem;
 471128    internal readonly DualKeyValueSet<int, long, DirtyData> markAsDirtyComponents = new DualKeyValueSet<int, long, Dirty
 471129    internal readonly DualKeyValueSet<int, long, DirtyData> removeAsDirtyComponents = new DualKeyValueSet<int, long, Dir
 30
 471131    public InternalECSComponent(InternalECSComponentsId id,
 32        ECSComponentsManager componentsManager,
 33        ECSComponentsFactory componentsFactory,
 34        Func<IECSComponentHandler<T>> handlerBuilder,
 35        IReadOnlyDictionary<int, ICRDTExecutor> crdtExecutors,
 36        IComponentDirtySystem dirtySystem)
 37    {
 471138        this.componentId = (int)id;
 471139        this.componentsFactory = componentsFactory;
 471140        this.crdtExecutors = crdtExecutors;
 471141        this.dirtySystem = dirtySystem;
 42
 471143        componentsFactory.AddOrReplaceComponent<T>(componentId, x => (T)x, handlerBuilder);
 471144        component = (ECSComponent<T>)componentsManager.GetOrCreateComponent(componentId);
 45
 471146        dirtySystem.MarkComponentsAsDirty += MarkDirtyComponentData;
 471147        dirtySystem.RemoveComponentsAsDirty += ResetDirtyComponentData;
 471148    }
 49
 50    public void Dispose()
 51    {
 2152        componentsFactory.RemoveComponent(componentId);
 2153        dirtySystem.MarkComponentsAsDirty -= MarkDirtyComponentData;
 2154        dirtySystem.RemoveComponentsAsDirty -= ResetDirtyComponentData;
 2155    }
 56
 057    public int ComponentId => componentId;
 58
 59    public void PutFor(IParcelScene scene, IDCLEntity entity, T model)
 60    {
 73761        PutFor(scene, entity.entityId, model);
 73762    }
 63
 64    public void PutFor(IParcelScene scene, long entityId, T model)
 65    {
 94766        PutFor(scene.sceneData.sceneNumber, entityId, model);
 94767    }
 68
 69    public void PutFor(int sceneNumber, long entityId, T model)
 70    {
 94771        if (crdtExecutors.TryGetValue(sceneNumber, out ICRDTExecutor crdtExecutor))
 72        {
 94173            markAsDirtyComponents[sceneNumber, entityId] = new DirtyData(model, false);
 74
 94175            crdtExecutor.PutComponent(entityId, component, model);
 76        }
 94777    }
 78
 79    public void RemoveFor(IParcelScene scene, IDCLEntity entity, T defaultModel) =>
 9780        RemoveFor(scene, entity.entityId, defaultModel);
 81
 82    public void RemoveFor(IParcelScene scene, long entityId, T defaultModel) =>
 9783        RemoveFor(scene.sceneData.sceneNumber, entityId, defaultModel);
 84
 85    public void RemoveFor(int sceneNumber, long entityId, T defaultModel)
 86    {
 9787        if (!crdtExecutors.TryGetValue(sceneNumber, out ICRDTExecutor crdtExecutor))
 088            return;
 89
 9790        markAsDirtyComponents[sceneNumber, entityId] = new DirtyData(defaultModel, true);
 91
 9792        crdtExecutor.PutComponent(entityId, component, defaultModel);
 9793    }
 94
 95    public void RemoveFor(IParcelScene scene, IDCLEntity entity) =>
 17496        RemoveFor(scene, entity.entityId);
 97
 98    public void RemoveFor(IParcelScene scene, long entityId) =>
 17799        RemoveFor(scene.sceneData.sceneNumber, entityId);
 100
 101    public void RemoveFor(int sceneNumber, long entityId)
 102    {
 177103        markAsDirtyComponents.Remove(sceneNumber, entityId);
 104
 177105        if (!crdtExecutors.TryGetValue(sceneNumber, out ICRDTExecutor crdtExecutor))
 0106            return;
 107
 177108        crdtExecutor.RemoveComponent(entityId, componentId);
 177109    }
 110
 111    public ECSComponentData<T>? GetFor(IParcelScene scene, IDCLEntity entity)
 112    {
 723113        return GetFor(scene, entity.entityId);
 114    }
 115
 116    public ECSComponentData<T>? GetFor(IParcelScene scene, long entityId)
 117    {
 927118        if (component.TryGet(scene, entityId, out var data))
 119        {
 469120            if (markAsDirtyComponents.TryGetValue(scene.sceneData.sceneNumber, entityId, out var dirtyData))
 121            {
 429122                T model = dirtyData.Data;
 429123                model.dirty = true;
 429124                return data.With(model);
 125            }
 126
 40127            return data;
 128        }
 129
 458130        return null;
 131    }
 132
 133    public IReadOnlyList<KeyValueSetTriplet<IParcelScene, long, ECSComponentData<T>>> GetForAll()
 134    {
 178135        return component.Get();
 136    }
 137
 138    private void MarkDirtyComponentData()
 139    {
 1265140        var markAsDirty = markAsDirtyComponents.Pairs;
 141
 2698142        for (int i = 0; i < markAsDirty.Count; i++)
 143        {
 84144            int sceneNumber = markAsDirty[i].key1;
 84145            long entityId = markAsDirty[i].key2;
 84146            T data = markAsDirty[i].value.Data;
 84147            bool isRemoval = markAsDirty[i].value.IsDelayedRemoval;
 148
 84149            if (!crdtExecutors.TryGetValue(sceneNumber, out ICRDTExecutor crdtExecutor))
 150            {
 151                continue;
 152            }
 153
 84154            data.dirty = true;
 84155            crdtExecutor.PutComponent(entityId, component, data);
 84156            removeAsDirtyComponents[sceneNumber, entityId] = new DirtyData(data, isRemoval);
 157        }
 158
 1265159        markAsDirtyComponents.Clear();
 1265160    }
 161
 162    private void ResetDirtyComponentData()
 163    {
 1219164        var resetDirtyComponents = removeAsDirtyComponents.Pairs;
 165
 2594166        for (int i = 0; i < resetDirtyComponents.Count; i++)
 167        {
 78168            int sceneNumber = resetDirtyComponents[i].key1;
 78169            long entityId = resetDirtyComponents[i].key2;
 78170            T data = resetDirtyComponents[i].value.Data;
 78171            bool isRemoval = resetDirtyComponents[i].value.IsDelayedRemoval;
 172
 78173            if (!crdtExecutors.TryGetValue(sceneNumber, out ICRDTExecutor crdtExecutor))
 174            {
 175                continue;
 176            }
 177
 78178            if (isRemoval)
 179            {
 3180                crdtExecutor.RemoveComponent(entityId, componentId);
 181            }
 182            else
 183            {
 75184                data.dirty = false;
 75185                crdtExecutor.PutComponent(entityId, component, data);
 186            }
 187        }
 188
 1219189        removeAsDirtyComponents.Clear();
 1219190    }
 191}