Class Linker
Defined in File linker.h
Nested Relationships
Nested Types
Class Documentation
-
class Linker
Типобезопасный менеджер двунаправленных связей между объектами.
Позволяет связывать произвольные объекты разных типов без создания жёстких зависимостей, наследования или владения памятью. Каждая связь является двунаправленной: объект
AнаходитB, аBнаходитA.Особенности:
Один объект может иметь связь максимум с одним объектом заданного типа.
Хранит только сырые указатели. Не продлевает время жизни объектов.
Все операции поиска выполняются за O(1) в среднем.
Поддерживает массовое отключение связей (
detach) для безопасного удаления объектов.
Предупреждение
Не потокобезопасен. При конкурентном вызове
link/unlink/detach/clearиз нескольких потоков требуется внешняя синхронизация (например,std::mutex).Предупреждение
Использование висячих указателей (объект удалён, но не отвязан) ведёт к UB.
Public Functions
-
Linker() = default
-
~Linker()
-
template<typename A, typename B>
inline void link(A *a, B *b) Устанавливает двунаправленную связь между двумя объектами.
Если хотя бы один из объектов уже имеет связь с целевым типом, операция игнорируется.
- Параметры шаблона:
A – Тип первого объекта
B – Тип второго объекта
- Параметры:
a – Указатель на первый объект (может быть
nullptr)b – Указатель на второй объект (может быть
nullptr) @complexity O(1) в среднем
-
template<typename A, typename B>
inline void unlink(A *a, B *b) Разрывает конкретную двунаправленную связь между двумя объектами.
Безопасна даже если связь не существует. Проверяет совпадение указателей перед удалением, чтобы избежать случайного стирания других записей.
- Параметры шаблона:
A – Тип первого объекта
B – Тип второго объекта
- Параметры:
a – Указатель на первый объект
b – Указатель на второй объект @complexity O(1) в среднем
-
template<typename T>
inline void detach(T *obj) Мгновенно разрывает ВСЕ связи указанного объекта.
Идеально подходит для вызова в деструкторах или при выгрузке сцены. Автоматически находит все привязанные к
objобъекты любого типа и удаляет как прямые, так и обратные записи.- Параметры шаблона:
T – Тип объекта, связи которого нужно очистить
- Параметры:
obj – Указатель на объект @complexity O(N), где N — количество связей у данного объекта
-
template<typename A, typename B>
inline B *find(A *a) Находит объект, связанный с данным экземпляром.
Возвращает указатель на связанный объект типа
B, привязанный кa. Если связи нет илиa == nullptr, возвращаетnullptr.- Параметры шаблона:
A – Тип исходного объекта
B – Тип искомого объекта
- Параметры:
a – Указатель на исходный объект
- Результат:
B* Указатель на связанный объект или nullptr @complexity O(1) в среднем
-
void clear()
Полностью очищает все зарегистрированные связи.
Примечание
Не вызывает деструкторы объектов. Только забывает о связях. @complexity O(N), где N — общее количество записей в таблице