qosd: добавил краевые узлы

Краевые узлы не могут иметь дочерние узлы. Отлично подходит для
бесклассовых дисциплин. Например, вариации FIFO, Fair Queue, RED и т.д.

Псевдо-бесклассовые по типу TBF, которые подключают в себя FIFO (или
любую указанную пользователем дисциплину), всё ещё должны пользоваться
SimpleNode.
This commit is contained in:
2025-08-06 22:57:28 +07:00
parent df1a728f56
commit 79caaad58d
5 changed files with 53 additions and 15 deletions
+10 -9
View File
@@ -1,20 +1,21 @@
#pragma once
#include <iostream>
#include "mixins/LazyLinkMixin.h"
#include <memory>
#include "ifaces/INode.h"
#include "mixins/LazyLinkMixin.h"
#include "links/OneToManyLink.h"
#include "links/OneToOneLink.h"
#include "Logger.h"
/// \brief Миксин для иерархических связей между элементами.
/// \tparam TElem Тип дочернего элемента.
/// \tparam INode Тип дочернего элемента.
/// Автоматически выбирает тип связи (один-ко-многим или один-к-одному) в зависимости от типа
/// дочернего узла. Если тип дочернего узла совпадает с родителем, то используется связь
/// один-ко-многим. При попытке подключить узел отличного типа выбирается связь один-к-одному.
template <class TElem>
class HierarchicalLinkMixin : public LazyLinkMixin<OneToOneLink<TElem>> {
using LinkPtr = std::shared_ptr<ILink<TElem>>;
using ElemPtr = std::shared_ptr<TElem>;
class HierarchicalLinkMixin : public LazyLinkMixin<OneToOneLink<INode>> {
using LinkPtr = std::shared_ptr<ILink<INode>>;
using ElemPtr = std::shared_ptr<INode>;
public:
~HierarchicalLinkMixin() override {
@@ -23,7 +24,7 @@ public:
void linkChild(const ElemPtr& child) override {
hierarchicalInit(child);
LazyLinkMixin<OneToOneLink<TElem>>::linkChild(child);
LazyLinkMixin<OneToOneLink<INode>>::linkChild(child);
}
protected:
@@ -36,10 +37,10 @@ protected:
if (typeid(*child) == typeid(*this)) {
Logger::get("Mixin").dbg("--- Mutate to OneToMany");
newLink = std::make_shared<OneToManyLink<TElem>>(*this);
newLink = std::make_shared<OneToManyLink<INode>>(*this);
} else {
Logger::get("Mixin").dbg("--- Mutate to OneToOne");
newLink = std::make_shared<OneToOneLink<TElem>>(*this);
newLink = std::make_shared<OneToOneLink<INode>>(*this);
}
if (newLink && this->link_)