mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-17 17:34:36 +08:00
update StructList
This commit is contained in:
parent
4db3b1c32d
commit
c23aa1b223
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,8 +115,11 @@ 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];
|
||||||
|
if (_IsManaged)
|
||||||
|
{
|
||||||
_items[_count] = default;
|
_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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user