Compare commits

..

6 Commits

Author SHA1 Message Date
Сергей Маринкевич 4fedc9fd37 qosd: исправлен комментарий 2025-08-05 19:55:30 +07:00
Сергей Маринкевич 8f89980024 qosd: обезопашен обход дерева с модификацией
Примеров итератора с доступом на чтение я много оставил, а пример
модификации дерева только один. И тот я сразу забыл перевести на
итераторы (range-based for loop).

Т.к. проход теперь не по вектору (он давал экземпляр умного указателя),
а по обычному указателю (собственному прокси, если точнее), то узел
разрушался уже в процессе его отключения от дерева. Добавил удержание
ссылки в сам `unlinkParent()` (ну, нам действительно может быть нужно
только безвозвратное удаление поддерева) и пример в `main.cpp` расширил
и прокомментировал.
2025-08-05 19:49:58 +07:00
Сергей Маринкевич 7f4d8c829d fup fabric 2025-08-05 19:49:39 +07:00
Сергей Маринкевич 06641a3767 qosd: в миксины добавлен оператор конвертации в умный указатель
В отличие от метода `getNode()`, оператор конвертации будет публичным.
А ещё он позволяет преобразовывать объект неявно.
2025-08-05 19:47:40 +07:00
Сергей Маринкевич 5f8c4d6979 qosd: создание узлов переведено на фабричный метод
Решил обойтись простым ~~советским~~ статическим методом:

	template <typename T>
	class FabricMixin {
	public:
		template <typename... Args>
		static std::shared_ptr<T> create(Args&&... args) {
			return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
		}
	};

Ну ладно, он не так просто выглядит на первый взгляд. Но, по сути, всё,
что он делает: параметризует метод типом возвращаемого указателя, и
передаёт все аргументы как есть в конструктор заданного типа. Решил
сделать так, чтобы не копипастить тело конструктора. Ну, вдруг я,
например, трассировку туда добавить захочу. Правда, есть недостаток у
такого решения:

	class SimpleNode : ...,
			   public FabricMixin<SimpleNode> {
		friend class FabricMixin<SimpleNode>;

Не очень удобное подключение: а) нужно внести по крайней мере две
строчки; б) автоматически самого себя параметром шаблона передавать
нельзя.

Вносить этот метод в `BaseNode` (или около) не хотел, чтобы не
пробрасывать оконечный тип по всей иерархии. Да и от указанных выше
проблем он не избавляет. Зато можно будет относительно безболезненно
выпилить этот класс, если ему подвернётся достойная замена.
2025-08-05 19:38:01 +07:00
Сергей Маринкевич 6c5d9d7992 qosd: трассировка кон-/деструкторов переведена на отдельный логгер
Т.к. в основном меня либо интересует создание/удаление объектов, либо
нет. Смысла объединять это логи с другими логами объектов каждой
подсистемы я не вижу.
2025-08-05 19:34:24 +07:00
2 changed files with 0 additions and 5 deletions
-1
View File
@@ -12,7 +12,6 @@ public:
virtual ~ILinkMixin() = default; virtual ~ILinkMixin() = default;
virtual operator std::shared_ptr<TElem>() = 0; virtual operator std::shared_ptr<TElem>() = 0;
virtual operator TElem&() = 0;
virtual void linkChild(const ElemPtr& child) = 0; virtual void linkChild(const ElemPtr& child) = 0;
virtual void unlinkParent() = 0; virtual void unlinkParent() = 0;
virtual const std::vector<ElemPtr>& children() = 0; virtual const std::vector<ElemPtr>& children() = 0;
-4
View File
@@ -21,10 +21,6 @@ public:
return this->getNode(); return this->getNode();
} }
operator INode&() override {
return static_cast<INode&>(*this);
}
void linkChild(const ElemPtr& child) override { void linkChild(const ElemPtr& child) override {
getLink()->addChild(child); getLink()->addChild(child);