From 5243218b73e6907037c13e6e4d2e5c0097848e4f Mon Sep 17 00:00:00 2001
From: Mikhail <99481254+DCFApixels@users.noreply.github.com>
Date: Sat, 8 Apr 2023 23:01:10 +0800
Subject: [PATCH] update set operations for EcsGroup
---
src/EcsGroup.cs | 118 ++++++++++++++++++++++++++----------------------
1 file changed, 64 insertions(+), 54 deletions(-)
diff --git a/src/EcsGroup.cs b/src/EcsGroup.cs
index 9653ade..cf11664 100644
--- a/src/EcsGroup.cs
+++ b/src/EcsGroup.cs
@@ -1,6 +1,7 @@
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
+using static UnityEngine.Networking.UnityWebRequest;
using delayedOp = System.Int32;
namespace DCFApixels.DragonECS
@@ -10,6 +11,7 @@ namespace DCFApixels.DragonECS
{
private readonly EcsGroup _source;
+
#region Constructors
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public EcsReadonlyGroup(EcsGroup source) => _source = source;
@@ -44,6 +46,24 @@ namespace DCFApixels.DragonECS
return new EcsGroup(_source);
}
#endregion
+
+ #region Object
+ public override string ToString()
+ {
+ if (_source != null)
+ return _source.ToString();
+ return "NULL";
+ }
+ #endregion
+
+ #region Internal
+ internal void Release()
+ {
+ _source.World.ReleaseGroup(_source);
+ }
+ internal EcsGroup GetGroupInternal() => _source;
+
+ #endregion
}
// не может содержать значение 0
@@ -206,26 +226,6 @@ namespace DCFApixels.DragonECS
}
#endregion
- #region AddGroup/RemoveGroup
- public void AddGroup(EcsReadonlyGroup group)
- { foreach (var item in group) Add(item.id); }
- public void RemoveGroup(EcsReadonlyGroup group)
- { foreach (var item in group) Remove(item.id); }
- public void AddGroup(EcsGroup group)
- { foreach (var item in group) Add(item.id); }
- public void RemoveGroup(EcsGroup group)
- { foreach (var item in group) Remove(item.id); }
-
- public void UncheckedAddGroup(EcsReadonlyGroup group)
- { foreach (var item in group) AddInternal(item.id); }
- public void UncheckedRemoveGroup(EcsReadonlyGroup group)
- { foreach (var item in group) RemoveInternal(item.id); }
- public void UncheckedAddGroup(EcsGroup group)
- { foreach (var item in group) AddInternal(item.id); }
- public void UncheckedRemoveGroup(EcsGroup group)
- { foreach (var item in group) RemoveInternal(item.id); }
- #endregion
-
internal void OnWorldResize(int newSize)
{
Array.Resize(ref _sparse, newSize);
@@ -245,55 +245,58 @@ namespace DCFApixels.DragonECS
}
public void Clear() => _count = 0;
- #region Set operations
- public static EcsReadonlyGroup And(EcsGroup a, EcsGroup b)
+ public void CopyFrom(EcsGroup group)
{
#if (DEBUG && !DISABLE_DEBUG) || !DRAGONECS_NO_SANITIZE_CHECKS
- if (a.World != b.World) throw new ArgumentException("a.World != b.World");
+ if (group.World != _source) throw new ArgumentException("group.World != World");
#endif
- EcsGroup result = a.World.GetGroupFromPool();
- foreach (var item in a)
- if(b.Contains(item.id))
- result.AggressiveAdd(item.id);
+ Clear();
+ foreach (var item in group)
+ AggressiveAdd(item.id);
+ }
- return result.Readonly;
- }
- public static EcsReadonlyGroup Union(EcsGroup a, EcsGroup b)
+ #region Set operations
+ /// as Union sets
+ public void AddGroup(EcsGroup group)
{
#if (DEBUG && !DISABLE_DEBUG) || !DRAGONECS_NO_SANITIZE_CHECKS
- if (a.World != b.World) throw new ArgumentException("a.World != b.World");
+ if (_source != group.World) throw new ArgumentException("World != group.World");
#endif
- EcsGroup result = a.World.GetGroupFromPool();
- foreach (var item in a)
- result.AggressiveAdd(item.id);
- foreach (var item in b)
- result.Add(item.id);
- return result.Readonly;
+ foreach (var item in group)
+ if (!Contains(item.id))
+ AggressiveAdd(item.id);
}
- public static EcsReadonlyGroup Xor(EcsGroup a, EcsGroup b)
+ /// as Except sets
+ public void RemoveGroup(EcsGroup group)
{
#if (DEBUG && !DISABLE_DEBUG) || !DRAGONECS_NO_SANITIZE_CHECKS
- if (a.World != b.World) throw new ArgumentException("a.World != b.World");
+ if (_source != group.World) throw new ArgumentException("World != group.World");
#endif
- EcsGroup result = a.World.GetGroupFromPool();
- foreach (var item in a)
- if (!b.Contains(item.id))
- result.AggressiveAdd(item.id);
- foreach (var item in b)
- if (!a.Contains(item.id))
- result.AggressiveAdd(item.id);
- return result.Readonly;
+ foreach (var item in group)
+ if (Contains(item.id))
+ AggressiveRemove(item.id);
}
- public static EcsReadonlyGroup Remove(EcsGroup a, EcsGroup b)
+ /// as Intersect sets
+ public void AndWith(EcsGroup group)
{
#if (DEBUG && !DISABLE_DEBUG) || !DRAGONECS_NO_SANITIZE_CHECKS
- if (a.World != b.World) throw new ArgumentException("a.World != b.World");
+ if (World != group.World) throw new ArgumentException("World != group.World");
#endif
- EcsGroup result = a.World.GetGroupFromPool();
- foreach (var item in a)
- if (!b.Contains(item.id))
- result.AggressiveAdd(item.id);
- return result.Readonly;
+ foreach (var item in this)
+ if (group.Contains(item.id))
+ AggressiveRemove(item.id);
+ }
+ /// as Symmetric Except sets
+ public void XorWith(EcsGroup group)
+ {
+#if (DEBUG && !DISABLE_DEBUG) || !DRAGONECS_NO_SANITIZE_CHECKS
+ if (_source != group.World) throw new ArgumentException("World != group.World");
+#endif
+ foreach (var item in group)
+ if (Contains(item.id))
+ AggressiveRemove(item.id);
+ else
+ AggressiveAdd(item.id);
}
#endregion
@@ -355,6 +358,13 @@ namespace DCFApixels.DragonECS
public void Dispose() => _source.Unlock();
}
#endregion
+
+ #region OObject
+ public override string ToString()
+ {
+ return string.Join(", ", _dense.AsSpan(1, _count).ToArray());
+ }
+ #endregion
}
public static class EcsGroupExtensions