Class Linker

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 — общее количество записей в таблице