mirror of
https://github.com/osukey/osukey.git
synced 2025-07-01 16:29:58 +09:00
Remove createLifetimeEntry
from HitObjectEntryManager
This commit is contained in:
@ -31,8 +31,6 @@ namespace osu.Game.Rulesets.Objects.Pooling
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public event Action<HitObjectLifetimeEntry, HitObject?>? OnEntryRemoved;
|
public event Action<HitObjectLifetimeEntry, HitObject?>? OnEntryRemoved;
|
||||||
|
|
||||||
private readonly Func<HitObject, HitObjectLifetimeEntry> createLifetimeEntry;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides the reverse mapping of <see cref="HitObjectLifetimeEntry.HitObject"/> for each entry.
|
/// Provides the reverse mapping of <see cref="HitObjectLifetimeEntry.HitObject"/> for each entry.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -53,37 +51,33 @@ namespace osu.Game.Rulesets.Objects.Pooling
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly Dictionary<HitObject, List<HitObjectLifetimeEntry>> childrenMap = new Dictionary<HitObject, List<HitObjectLifetimeEntry>>();
|
private readonly Dictionary<HitObject, List<HitObjectLifetimeEntry>> childrenMap = new Dictionary<HitObject, List<HitObjectLifetimeEntry>>();
|
||||||
|
|
||||||
public HitObjectEntryManager(Func<HitObject, HitObjectLifetimeEntry> createLifetimeEntry)
|
public void Add(HitObjectLifetimeEntry entry, HitObject? parent)
|
||||||
{
|
{
|
||||||
this.createLifetimeEntry = createLifetimeEntry;
|
if (parentMap.ContainsKey(entry))
|
||||||
}
|
throw new InvalidOperationException($@"The {nameof(HitObjectLifetimeEntry)} is already added to this {nameof(HitObjectEntryManager)}.");
|
||||||
|
|
||||||
public HitObjectLifetimeEntry Add(HitObject hitObject, HitObject? parent)
|
var hitObject = entry.HitObject;
|
||||||
{
|
|
||||||
if (entryMap.ContainsKey(hitObject))
|
|
||||||
throw new InvalidOperationException($@"The {nameof(HitObject)} is already added to this {nameof(HitObjectEntryManager)}.");
|
|
||||||
|
|
||||||
var entry = createLifetimeEntry(hitObject);
|
|
||||||
entryMap[hitObject] = entry;
|
|
||||||
parentMap[entry] = parent;
|
parentMap[entry] = parent;
|
||||||
|
entryMap[hitObject] = entry;
|
||||||
|
|
||||||
if (parent != null && childrenMap.TryGetValue(parent, out var parentChildEntries))
|
if (parent != null && childrenMap.TryGetValue(parent, out var parentChildEntries))
|
||||||
parentChildEntries.Add(entry);
|
parentChildEntries.Add(entry);
|
||||||
|
|
||||||
hitObject.DefaultsApplied += onDefaultsApplied;
|
hitObject.DefaultsApplied += onDefaultsApplied;
|
||||||
|
|
||||||
childrenMap[entry.HitObject] = new List<HitObjectLifetimeEntry>();
|
childrenMap[hitObject] = new List<HitObjectLifetimeEntry>();
|
||||||
|
|
||||||
OnEntryAdded?.Invoke(entry, parent);
|
OnEntryAdded?.Invoke(entry, parent);
|
||||||
return entry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Remove(HitObject hitObject)
|
public void Remove(HitObjectLifetimeEntry entry)
|
||||||
{
|
{
|
||||||
if (!entryMap.Remove(hitObject, out var entry))
|
if (!parentMap.ContainsKey(entry))
|
||||||
return false;
|
throw new InvalidOperationException($@"The {nameof(HitObjectLifetimeEntry)} is not contained in this {nameof(HitObjectLifetimeEntry)}.");
|
||||||
|
|
||||||
|
var hitObject = entry.HitObject;
|
||||||
parentMap.Remove(entry, out var parent);
|
parentMap.Remove(entry, out var parent);
|
||||||
|
entryMap.Remove(hitObject);
|
||||||
|
|
||||||
if (parent != null && childrenMap.TryGetValue(parent, out var parentChildEntries))
|
if (parent != null && childrenMap.TryGetValue(parent, out var parentChildEntries))
|
||||||
parentChildEntries.Remove(entry);
|
parentChildEntries.Remove(entry);
|
||||||
@ -94,11 +88,10 @@ namespace osu.Game.Rulesets.Objects.Pooling
|
|||||||
if (childrenMap.Remove(entry.HitObject, out var childEntries))
|
if (childrenMap.Remove(entry.HitObject, out var childEntries))
|
||||||
{
|
{
|
||||||
foreach (var childEntry in childEntries)
|
foreach (var childEntry in childEntries)
|
||||||
Remove(childEntry.HitObject);
|
Remove(childEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
OnEntryRemoved?.Invoke(entry, parent);
|
OnEntryRemoved?.Invoke(entry, parent);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryGet(HitObject hitObject, [MaybeNullWhen(false)] out HitObjectLifetimeEntry entry)
|
public bool TryGet(HitObject hitObject, [MaybeNullWhen(false)] out HitObjectLifetimeEntry entry)
|
||||||
@ -115,7 +108,7 @@ namespace osu.Game.Rulesets.Objects.Pooling
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (var entry in childEntries)
|
foreach (var entry in childEntries)
|
||||||
Remove(entry.HitObject);
|
Remove(entry);
|
||||||
|
|
||||||
childEntries.Clear();
|
childEntries.Clear();
|
||||||
childrenMap[hitObject] = childEntries;
|
childrenMap[hitObject] = childEntries;
|
||||||
|
@ -95,7 +95,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private IReadOnlyList<Mod> mods { get; set; }
|
private IReadOnlyList<Mod> mods { get; set; }
|
||||||
|
|
||||||
private readonly HitObjectEntryManager entryManager;
|
private readonly HitObjectEntryManager entryManager = new HitObjectEntryManager();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new <see cref="Playfield"/>.
|
/// Creates a new <see cref="Playfield"/>.
|
||||||
@ -112,7 +112,6 @@ namespace osu.Game.Rulesets.UI
|
|||||||
h.HitObjectUsageFinished += o => HitObjectUsageFinished?.Invoke(o);
|
h.HitObjectUsageFinished += o => HitObjectUsageFinished?.Invoke(o);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
entryManager = new HitObjectEntryManager(CreateLifetimeEntry);
|
|
||||||
entryManager.OnEntryAdded += onEntryAdded;
|
entryManager.OnEntryAdded += onEntryAdded;
|
||||||
entryManager.OnEntryRemoved += onEntryRemoved;
|
entryManager.OnEntryRemoved += onEntryRemoved;
|
||||||
}
|
}
|
||||||
@ -271,7 +270,8 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// <param name="hitObject"></param>
|
/// <param name="hitObject"></param>
|
||||||
public virtual void Add(HitObject hitObject)
|
public virtual void Add(HitObject hitObject)
|
||||||
{
|
{
|
||||||
entryManager.Add(hitObject, null);
|
var entry = CreateLifetimeEntry(hitObject);
|
||||||
|
entryManager.Add(entry, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void preloadSamples(HitObject hitObject)
|
private void preloadSamples(HitObject hitObject)
|
||||||
@ -294,7 +294,13 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// <returns>Whether the <see cref="HitObject"/> was successfully removed.</returns>
|
/// <returns>Whether the <see cref="HitObject"/> was successfully removed.</returns>
|
||||||
public virtual bool Remove(HitObject hitObject)
|
public virtual bool Remove(HitObject hitObject)
|
||||||
{
|
{
|
||||||
return entryManager.Remove(hitObject) || nestedPlayfields.Any(p => p.Remove(hitObject));
|
if (entryManager.TryGet(hitObject, out var entry))
|
||||||
|
{
|
||||||
|
entryManager.Remove(entry);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nestedPlayfields.Any(p => p.Remove(hitObject));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onEntryAdded(HitObjectLifetimeEntry entry, [CanBeNull] HitObject parentHitObject)
|
private void onEntryAdded(HitObjectLifetimeEntry entry, [CanBeNull] HitObject parentHitObject)
|
||||||
@ -378,7 +384,10 @@ namespace osu.Game.Rulesets.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!entryManager.TryGet(hitObject, out var entry))
|
if (!entryManager.TryGet(hitObject, out var entry))
|
||||||
entry = entryManager.Add(hitObject, parent?.HitObject);
|
{
|
||||||
|
entry = CreateLifetimeEntry(hitObject);
|
||||||
|
entryManager.Add(entry, parent?.HitObject);
|
||||||
|
}
|
||||||
|
|
||||||
dho.ParentHitObject = parent;
|
dho.ParentHitObject = parent;
|
||||||
dho.Apply(entry);
|
dho.Apply(entry);
|
||||||
|
Reference in New Issue
Block a user