From 51bf6092c5c0d33292a268da80a0ee97264f685f Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 17 Mar 2025 21:46:51 +0800 Subject: [PATCH] update meta id --- .../MetaAttributes/MetaIDAttribute.cs | 93 +++++++++++++------ src/DebugUtils/TypeMeta.cs | 9 -- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/DebugUtils/MetaAttributes/MetaIDAttribute.cs b/src/DebugUtils/MetaAttributes/MetaIDAttribute.cs index 05593e9..f2ffc29 100644 --- a/src/DebugUtils/MetaAttributes/MetaIDAttribute.cs +++ b/src/DebugUtils/MetaAttributes/MetaIDAttribute.cs @@ -41,12 +41,17 @@ namespace DCFApixels.DragonECS [ThreadStatic] private static bool _isInit; + + public static bool TryFindMetaIDCollisions(IEnumerable metas, out CollisionList collisions) + { + collisions = new CollisionList(metas); + return collisions.IsHasAnyCollision; + } public static CollisionList FindMetaIDCollisions(IEnumerable metas) { return new CollisionList(metas); } - public static bool IsGenericID(string id) { return Regex.IsMatch(id, @"^[^,<>\s]*$"); @@ -87,17 +92,18 @@ namespace DCFApixels.DragonECS #region CollisionList [DebuggerTypeProxy(typeof(DebuggerProxy))] - public class CollisionList : IEnumerable + [DebuggerDisplay("HasAnyCollision: {IsHasAnyCollision} ListsCount: {ListsCount}")] + public class CollisionList : IEnumerable { - private ListInternal[] _linkedLists; - private Entry[] _linkedEntries; + private LinkedList[] _linkedLists; + private Entry[] _entries; private int _collisionsCount; private int _listsCount; public int CollisionsCount { get { return _collisionsCount; } } - public int ListsCount + public int Count { get { return _listsCount; } } @@ -105,13 +111,21 @@ namespace DCFApixels.DragonECS { get { return _listsCount > 0; } } + public Collision this[int index] + { + get + { + var list = _linkedLists[index]; + return new Collision(this, list.headNode, list.count); + } + } public CollisionList(IEnumerable metas) { var metasCount = metas.Count(); Dictionary listIndexes = new Dictionary(metasCount); - _linkedLists = new ListInternal[metasCount]; - _linkedEntries = new Entry[metasCount]; + _linkedLists = new LinkedList[metasCount]; + _entries = new Entry[metasCount]; bool hasCollision = false; @@ -127,15 +141,21 @@ namespace DCFApixels.DragonECS headIndex = _listsCount++; listIndexes.Add(meta.MetaID, headIndex); } - ref var list = ref _linkedLists[headIndex]; int nodeIndex = _collisionsCount++; - ref Entry entry = ref _linkedEntries[nodeIndex]; + + ref var list = ref _linkedLists[headIndex]; + ref Entry entry = ref _entries[nodeIndex]; if (list.count == 0) { entry.next = -1; } + else + { + entry.next = list.headNode; + } entry.meta = meta; - list.head = headIndex; + list.headNode = nodeIndex; + listIndexes[meta.MetaID] = headIndex; list.count++; } @@ -146,7 +166,7 @@ namespace DCFApixels.DragonECS ref var list = ref _linkedLists[i]; if (list.count <= 1) { - _linkedLists[i] = _linkedLists[--_listsCount]; + _linkedLists[i--] = _linkedLists[--_listsCount]; } } } @@ -156,11 +176,13 @@ namespace DCFApixels.DragonECS } } - private struct ListInternal + [DebuggerDisplay("Count: {count}")] + private struct LinkedList { public int count; - public int head; + public int headNode; } + [DebuggerDisplay("ID: {meta.MetaID} next: {next}")] public struct Entry { public TypeMeta meta; @@ -168,20 +190,20 @@ namespace DCFApixels.DragonECS } #region Enumerator - public Enumerator GetEnumerator() { return new Enumerator(); } + public Enumerator GetEnumerator() { return new Enumerator(this, _listsCount); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } - IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } - public struct Enumerator : IEnumerator + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } + public struct Enumerator : IEnumerator { private readonly CollisionList _collisions; private readonly int _count; private int _index; - public List Current + public Collision Current { get { var list = _collisions._linkedLists[_index]; - return new List(_collisions, list.head, list.count); + return new Collision(_collisions, list.headNode, list.count); } } object IEnumerator.Current { get { return Current; } } @@ -191,31 +213,46 @@ namespace DCFApixels.DragonECS _count = count; _index = -1; } - public bool MoveNext() { return _index++ < _count; } + public bool MoveNext() { return ++_index < _count; } public void Dispose() { } public void Reset() { _index = -1; } } #endregion - public readonly struct List : IEnumerable + [DebuggerDisplay("Count: {Count}")] + public readonly struct Collision : IEnumerable { private readonly CollisionList _collisions; + private readonly string _metaID; private readonly int _head; private readonly int _count; public int Count { get { return _count; } } - internal List(CollisionList collisions, int head, int count) + public string MetaID + { + get { return _metaID; } + } + internal Collision(CollisionList collisions, int head, int count) { _collisions = collisions; - _head = count == 0 ? -1 : head; + if(count == 0) + { + _head = 0; + _metaID = string.Empty; + } + else + { + _head = head; + _metaID = collisions._entries[_head].meta.MetaID; + } _head = head; _count = count; } #region Enumerator - public Enumerator GetEnumerator() { return new Enumerator(_collisions._linkedEntries, _head); } + public Enumerator GetEnumerator() { return new Enumerator(_collisions._entries, _head); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public struct Enumerator : IEnumerator @@ -253,20 +290,18 @@ namespace DCFApixels.DragonECS #region DebuggerProxy private class DebuggerProxy { - private CollisionList _collisions; - public TypeMeta[][] Lists; + public string[][] Lists; public DebuggerProxy(CollisionList collisions) { - _collisions = collisions; - Lists = new TypeMeta[collisions.ListsCount][]; + Lists = new string[collisions.Count][]; int i = 0; foreach (var list in collisions) { int j = 0; - Lists[i] = new TypeMeta[list.Count]; + Lists[i] = new string[list.Count]; foreach (var typeMeta in list) { - Lists[i][j] = typeMeta; + Lists[i][j] = typeMeta.MetaID; j++; } i++; diff --git a/src/DebugUtils/TypeMeta.cs b/src/DebugUtils/TypeMeta.cs index 78c7577..ed6869a 100644 --- a/src/DebugUtils/TypeMeta.cs +++ b/src/DebugUtils/TypeMeta.cs @@ -538,9 +538,6 @@ namespace DCFApixels.DragonECS #endregion #region GetMetaID -#if DEBUG || !REFLECTION_DISABLED //в дебажных утилитах REFLECTION_DISABLED только в релизном билде работает - private static Dictionary _idTypePairs = new Dictionary(); -#endif public static string GetMetaID(Type type) { #if DEBUG || !REFLECTION_DISABLED //в дебажных утилитах REFLECTION_DISABLED только в релизном билде работает @@ -565,12 +562,6 @@ namespace DCFApixels.DragonECS id = $"{id}<{string.Join(", ", metaIds)}>"; } } - if (string.IsNullOrEmpty(id) == false && - _idTypePairs.TryGetValue(id, out Type otherType) && type != otherType) - { - Throw.Exception($"Types {type.ToMeta().TypeName} and {otherType.ToMeta().TypeName} have duplicate {atr.ID} MetaID."); - } - _idTypePairs[id] = type; return id; } #else