Remove createLifetimeEntry from HitObjectEntryManager

This commit is contained in:
ekrctb
2021-06-16 15:15:33 +09:00
committed by Dean Herbert
parent 47539e2129
commit c59aa57450
2 changed files with 27 additions and 25 deletions

View File

@ -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;

View File

@ -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);