update StructList

This commit is contained in:
DCFApixels 2025-07-11 17:38:45 +08:00
parent 4db3b1c32d
commit c23aa1b223
3 changed files with 96 additions and 9 deletions

View File

@ -114,7 +114,7 @@ namespace DCFApixels.DragonECS
} }
public ReadOnlySpan<WorldComponentPoolAbstract> GetAllWorldComponents() public ReadOnlySpan<WorldComponentPoolAbstract> GetAllWorldComponents()
{ {
return _worldComponentPools.ToReadOnlySpan(); return _worldComponentPools.AsReadOnlySpan();
} }
public abstract class WorldComponentPoolAbstract public abstract class WorldComponentPoolAbstract
{ {
@ -304,7 +304,7 @@ namespace DCFApixels.DragonECS
get get
{ {
_worldID = _world.ID; _worldID = _world.ID;
return _world._worldComponentPools.ToEnumerable().Skip(_world._builtinWorldComponentsCount).Select(o => o.GetRaw(_worldID)); return _world._worldComponentPools.AsEnumerable().Skip(_world._builtinWorldComponentsCount).Select(o => o.GetRaw(_worldID));
} }
} }
public IEnumerable<object> AllWorldComponents public IEnumerable<object> AllWorldComponents
@ -312,7 +312,7 @@ namespace DCFApixels.DragonECS
get get
{ {
_worldID = _world.ID; _worldID = _world.ID;
return _world._worldComponentPools.ToEnumerable().Select(o => o.GetRaw(_worldID)); return _world._worldComponentPools.AsEnumerable().Select(o => o.GetRaw(_worldID));
} }
} }
} }

View File

@ -12,8 +12,12 @@ namespace DCFApixels.DragonECS.Core.Internal
[DebuggerDisplay("Count: {Count}")] [DebuggerDisplay("Count: {Count}")]
internal struct StructList<T> internal struct StructList<T>
{ {
internal readonly static bool _IsManaged = RuntimeHelpers.IsReferenceOrContainsReferences<T>();
internal T[] _items; internal T[] _items;
internal int _count; internal int _count;
#region Properties
public int Count public int Count
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -30,6 +34,11 @@ namespace DCFApixels.DragonECS.Core.Internal
Array.Resize(ref _items, value); Array.Resize(ref _items, value);
} }
} }
public bool IsNull
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get { return _items == null; }
}
public T this[int index] public T this[int index]
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -49,13 +58,16 @@ namespace DCFApixels.DragonECS.Core.Internal
_items[index] = value; _items[index] = value;
} }
} }
#endregion
#region Constructors
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public StructList(int capacity) public StructList(int capacity)
{ {
_items = new T[ArrayUtility.NextPow2(capacity)]; _items = new T[ArrayUtility.NextPow2(capacity)];
_count = 0; _count = 0;
} }
#endregion
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Add(T item) public void Add(T item)
@ -64,6 +76,11 @@ namespace DCFApixels.DragonECS.Core.Internal
{ {
Array.Resize(ref _items, _items.Length << 1); Array.Resize(ref _items, _items.Length << 1);
} }
AddFixed(item);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AddFixed(T item)
{
_items[_count++] = item; _items[_count++] = item;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -72,6 +89,11 @@ namespace DCFApixels.DragonECS.Core.Internal
return Array.IndexOf(_items, item, 0, _count); return Array.IndexOf(_items, item, 0, _count);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Contains(T item)
{
return _count != 0 && IndexOf(item) >= 0;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SwapAt(int idnex1, int idnex2) public void SwapAt(int idnex1, int idnex2)
{ {
T tmp = _items[idnex1]; T tmp = _items[idnex1];
@ -93,7 +115,10 @@ namespace DCFApixels.DragonECS.Core.Internal
if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); } if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); }
#endif #endif
_items[index] = _items[--_count]; _items[index] = _items[--_count];
_items[_count] = default; if (_IsManaged)
{
_items[_count] = default;
}
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RemoveAtWithOrder(int index) public void RemoveAtWithOrder(int index)
@ -128,6 +153,56 @@ namespace DCFApixels.DragonECS.Core.Internal
} }
return false; return false;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Peek()
{
#if DEBUG
if (_count <= 0) { Throw.EmptyStack(); }
#endif
return _items[_count - 1];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryPeek(out T result)
{
if (_count <= 0)
{
result = default;
return false;
}
result = _items[_count - 1];
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Pop()
{
#if DEBUG
if (_count <= 0) { Throw.EmptyStack(); }
#endif
T result = _items[--_count];
if (_IsManaged)
{
_items[_count] = default;
}
return result;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryPop(out T result)
{
if (_count <= 0)
{
result = default;
return false;
}
result = _items[--_count];
if (_IsManaged)
{
_items[_count] = default;
}
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void FastClear() public void FastClear()
{ {
@ -136,9 +211,9 @@ namespace DCFApixels.DragonECS.Core.Internal
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Clear() public void Clear()
{ {
for (int i = 0; i < _count; i++) if (_IsManaged)
{ {
_items[i] = default; Array.Clear(_items, 0, _count);
} }
_count = 0; _count = 0;
} }
@ -148,14 +223,22 @@ namespace DCFApixels.DragonECS.Core.Internal
return new ReadOnlySpan<T>(_items, 0, _count).GetEnumerator(); return new ReadOnlySpan<T>(_items, 0, _count).GetEnumerator();
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public ReadOnlySpan<T> ToReadOnlySpan() public ReadOnlySpan<T> AsReadOnlySpan()
{ {
return new ReadOnlySpan<T>(_items, 0, _count); return new ReadOnlySpan<T>(_items, 0, _count);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public IEnumerable<T> ToEnumerable() public IEnumerable<T> AsEnumerable()
{ {
return _items.Take(_count); return _items.Take(_count);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T[] ToArray()
{
if (_count <= 0) { return Array.Empty<T>(); }
T[] result = new T[_count];
Array.Copy(_items, result, _count);
return result;
}
} }
} }

View File

@ -147,7 +147,11 @@ namespace DCFApixels.DragonECS.Core.Internal
throw new ArgumentException("The groups belong to different worlds."); throw new ArgumentException("The groups belong to different worlds.");
} }
[MethodImpl(MethodImplOptions.NoInlining)]
internal static void EmptyStack()
{
throw new InvalidOperationException("Invalid Operation Empty Stack.");
}
[MethodImpl(MethodImplOptions.NoInlining)] [MethodImpl(MethodImplOptions.NoInlining)]
internal static void ArgumentNull() internal static void ArgumentNull()
{ {