#include "Core/DescentGameClasses.h" FDescentGameClassRegistry& FDescentGameClassRegistry::Get() { static FDescentGameClassRegistry Instance; return Instance; } void FDescentGameClassRegistry::Register(EDescentGameClassSlot Slot, int32 Priority, FName Owner, FClassGetter Getter) { Unregister(Slot, Owner); // the same owner registering a slot again replaces its own entry FEntry E; E.Slot = Slot; E.Priority = Priority; E.Owner = Owner; E.Getter = MoveTemp(Getter); Entries.Add(MoveTemp(E)); } void FDescentGameClassRegistry::Unregister(EDescentGameClassSlot Slot, FName Owner) { Entries.RemoveAll([&](const FEntry& E) { return E.Slot == Slot && E.Owner == Owner; }); } const FDescentGameClassRegistry::FEntry* FDescentGameClassRegistry::Pick(EDescentGameClassSlot Slot) const { const FEntry* Best = nullptr; for (const FEntry& E : Entries) { if (E.Slot != Slot) { continue; } // Higher priority wins; at equal priority the owner name that sorts first, never the registration order. if (!Best || E.Priority > Best->Priority || (E.Priority == Best->Priority && E.Owner.Compare(Best->Owner) < 0)) { Best = &E; } } return Best; } UClass* FDescentGameClassRegistry::Resolve(EDescentGameClassSlot Slot) const { const FEntry* E = Pick(Slot); return (E && E->Getter) ? E->Getter() : nullptr; } FName FDescentGameClassRegistry::ResolveOwner(EDescentGameClassSlot Slot) const { const FEntry* E = Pick(Slot); return E ? E->Owner : NAME_None; }