Краевые узлы не могут иметь дочерние узлы. Отлично подходит для
бесклассовых дисциплин. Например, вариации FIFO, Fair Queue, RED и т.д.
Псевдо-бесклассовые по типу TBF, которые подключают в себя FIFO (или
любую указанную пользователем дисциплину), всё ещё должны пользоваться
SimpleNode.
Примеров итератора с доступом на чтение я много оставил, а пример
модификации дерева только один. И тот я сразу забыл перевести на
итераторы (range-based for loop).
Т.к. проход теперь не по вектору (он давал экземпляр умного указателя),
а по обычному указателю (собственному прокси, если точнее), то узел
разрушался уже в процессе его отключения от дерева. Добавил удержание
ссылки в сам `unlinkParent()` (ну, нам действительно может быть нужно
только безвозвратное удаление поддерева) и пример в `main.cpp` расширил
и прокомментировал.
Решил обойтись простым ~~советским~~ статическим методом:
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` (или около) не хотел, чтобы не
пробрасывать оконечный тип по всей иерархии. Да и от указанных выше
проблем он не избавляет. Зато можно будет относительно безболезненно
выпилить этот класс, если ему подвернётся достойная замена.
Т.к. в основном меня либо интересует создание/удаление объектов, либо
нет. Смысла объединять это логи с другими логами объектов каждой
подсистемы я не вижу.
New iterators can be used to iterate through Nodes.
Squashed commit of the following:
commit 602ed679631647dd1c8874b0b0145fcb09458341
Author: GRayHook <s@marinkevich.ru>
Date: Fri Aug 1 19:36:46 2025 +0700
fup after CR
commit 08f7b59aa7
Author: GRayHook <s@marinkevich.ru>
Date: Fri Aug 1 19:20:48 2025 +0700
normalize members of iterator
commit 038cbb73f4
Author: GRayHook <s@marinkevich.ru>
Date: Fri Aug 1 18:57:08 2025 +0700
bump
commit 0f93988fb6
Author: GRayHook <s@marinkevich.ru>
Date: Fri Aug 1 11:32:35 2025 +0700
tmp