< Summary

Class:DCLServices.MapRendererV2.MapLayers.UsersMarkers.ColdArea.ColdUserMarkersStorage
Assembly:MapRendererV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/UsersMarkers/ColdArea/ColdUserMarkersStorage.cs
Covered lines:8
Uncovered lines:35
Coverable lines:43
Total lines:110
Line coverage:18.6% (8 of 43)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:6
Method coverage:33.3% (2 of 6)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ColdUserMarkersStorage(...)0%110100%
AdjustPoolSize(...)0%6200%
Dispose()0%3.033085.71%
Update(...)0%72800%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLServices/MapRendererV2/MapLayers/UsersMarkers/ColdArea/ColdUserMarkersStorage.cs

#LineLine coverage
 1using MainScripts.DCL.Controllers.HotScenes;
 2using System;
 3using System.Collections.Generic;
 4using UnityEngine;
 5
 6namespace DCLServices.MapRendererV2.MapLayers.UsersMarkers.ColdArea
 7{
 8    internal partial struct ColdUserMarkersStorage
 9    {
 10        private readonly IColdUserMarker[] markers;
 11        private readonly Action<IColdUserMarker, (string realmServer, Vector2Int coords)> setData;
 12        private int usedMarkers;
 13
 14        internal ColdUserMarkersStorage(
 15            IColdUserMarker[] markers,
 16            Action<IColdUserMarker, (string realmServer, Vector2Int coords)> setData)
 17        {
 6918            this.markers = markers;
 6919            this.setData = setData;
 6920            usedMarkers = 0;
 6921        }
 22
 023        internal ReadOnlySpan<IColdUserMarker> Markers => markers.AsSpan()[..usedMarkers];
 24
 025        internal int Capacity => markers.Length;
 26
 27        internal void AdjustPoolSize(
 28            int newCount,
 29            out ReadOnlySpan<IColdUserMarker> newRents,
 30            out ReadOnlySpan<IColdUserMarker> recycledRents)
 31        {
 032            var recycledCount = usedMarkers - newCount;
 033            if (recycledCount > 0)
 34            {
 035                var indexToRecycleFrom = usedMarkers - recycledCount;
 036                recycledRents = markers.AsSpan().Slice(indexToRecycleFrom, recycledCount);
 037                newRents = ReadOnlySpan<IColdUserMarker>.Empty;
 38            }
 39            else
 40            {
 041                newRents = markers.AsSpan().Slice(usedMarkers, newCount - usedMarkers);
 042                recycledRents = ReadOnlySpan<IColdUserMarker>.Empty;
 43            }
 44
 045            usedMarkers = newCount;
 046        }
 47
 48        internal void Dispose()
 49        {
 650            if (markers == null)
 051                return;
 52
 121253            foreach (IColdUserMarker marker in markers)
 60054                marker.Dispose();
 655        }
 56
 57        internal void Update(IReadOnlyList<IHotScenesController.HotSceneInfo> scenesList,
 58            out ReadOnlySpan<IColdUserMarker> newRents,
 59            out ReadOnlySpan<IColdUserMarker> recycledRents)
 60        {
 061            var scenesCount = scenesList.Count;
 62
 63            // count users parcels first so we don't add superfluous elements
 064            var usersParcelsCount = 0;
 065            var maxMarkers = markers.Length;
 66
 067            for (var i = 0; i < scenesList.Count; i++)
 068                usersParcelsCount += scenesList[i].usersTotalCount;
 69
 70            // Partition parcels to fit `maxMarkers`
 071            var markersCount = Mathf.Min(usersParcelsCount, maxMarkers);
 72
 073            AdjustPoolSize(markersCount, out newRents, out recycledRents);
 74
 075            var step = Mathf.Max(1, usersParcelsCount / maxMarkers);
 76
 077            var partitionPointer = 0;
 078            var dataIndex = 0;
 79
 080            for (var i = 0; i < scenesCount; i++)
 81            {
 082                var sceneInfo = scenesList[i];
 83
 084                if (sceneInfo.usersTotalCount <= 0)
 85                    continue;
 86
 087                for (int realmIdx = 0; realmIdx < sceneInfo.realms.Length; realmIdx++)
 88                {
 089                    var realm = sceneInfo.realms[realmIdx];
 90
 091                    for (int parcelIdx = 0; parcelIdx < realm.userParcels.Length && dataIndex < markersCount; parcelIdx+
 92                    {
 093                        if (partitionPointer == 0)
 94                        {
 095                            var obj = markers[dataIndex];
 096                            setData(obj, (realm.serverName, realm.userParcels[parcelIdx]));
 97
 098                            dataIndex++;
 099                            partitionPointer += step - 1;
 100                        }
 101                        else
 102                        {
 0103                            partitionPointer--;
 104                        }
 105                    }
 106                }
 107            }
 0108        }
 109    }
 110}