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()
|
||||
{
|
||||
return _worldComponentPools.ToReadOnlySpan();
|
||||
return _worldComponentPools.AsReadOnlySpan();
|
||||
}
|
||||
public abstract class WorldComponentPoolAbstract
|
||||
{
|
||||
@ -304,7 +304,7 @@ namespace DCFApixels.DragonECS
|
||||
get
|
||||
{
|
||||
_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
|
||||
@ -312,7 +312,7 @@ namespace DCFApixels.DragonECS
|
||||
get
|
||||
{
|
||||
_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}")]
|
||||
internal struct StructList<T>
|
||||
{
|
||||
internal readonly static bool _IsManaged = RuntimeHelpers.IsReferenceOrContainsReferences<T>();
|
||||
|
||||
internal T[] _items;
|
||||
internal int _count;
|
||||
|
||||
#region Properties
|
||||
public int Count
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@ -30,6 +34,11 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
Array.Resize(ref _items, value);
|
||||
}
|
||||
}
|
||||
public bool IsNull
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get { return _items == null; }
|
||||
}
|
||||
public T this[int index]
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@ -49,13 +58,16 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
_items[index] = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public StructList(int capacity)
|
||||
{
|
||||
_items = new T[ArrayUtility.NextPow2(capacity)];
|
||||
_count = 0;
|
||||
}
|
||||
#endregion
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Add(T item)
|
||||
@ -64,6 +76,11 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
{
|
||||
Array.Resize(ref _items, _items.Length << 1);
|
||||
}
|
||||
AddFixed(item);
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void AddFixed(T item)
|
||||
{
|
||||
_items[_count++] = item;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@ -72,6 +89,11 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
return Array.IndexOf(_items, item, 0, _count);
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool Contains(T item)
|
||||
{
|
||||
return _count != 0 && IndexOf(item) >= 0;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void SwapAt(int idnex1, int idnex2)
|
||||
{
|
||||
T tmp = _items[idnex1];
|
||||
@ -93,8 +115,11 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
if (index < 0 || index >= _count) { Throw.ArgumentOutOfRange(); }
|
||||
#endif
|
||||
_items[index] = _items[--_count];
|
||||
if (_IsManaged)
|
||||
{
|
||||
_items[_count] = default;
|
||||
}
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void RemoveAtWithOrder(int index)
|
||||
{
|
||||
@ -128,6 +153,56 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
}
|
||||
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)]
|
||||
public void FastClear()
|
||||
{
|
||||
@ -136,9 +211,9 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Clear()
|
||||
{
|
||||
for (int i = 0; i < _count; i++)
|
||||
if (_IsManaged)
|
||||
{
|
||||
_items[i] = default;
|
||||
Array.Clear(_items, 0, _count);
|
||||
}
|
||||
_count = 0;
|
||||
}
|
||||
@ -148,14 +223,22 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
return new ReadOnlySpan<T>(_items, 0, _count).GetEnumerator();
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public ReadOnlySpan<T> ToReadOnlySpan()
|
||||
public ReadOnlySpan<T> AsReadOnlySpan()
|
||||
{
|
||||
return new ReadOnlySpan<T>(_items, 0, _count);
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public IEnumerable<T> ToEnumerable()
|
||||
public IEnumerable<T> AsEnumerable()
|
||||
{
|
||||
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.");
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
internal static void EmptyStack()
|
||||
{
|
||||
throw new InvalidOperationException("Invalid Operation Empty Stack.");
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||
internal static void ArgumentNull()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user