/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #ifndef SMOLBOTE_FILTERTREE_H #define SMOLBOTE_FILTERTREE_H #include #include #include #include #include "filterleaf.h" #include "domain.h" /** FilterTree: B+ tree of filter rules * The root of the tree contains branches that represent domains, on which their rules are to be applied. * Each branch contains leaves - rules */ class FilterTree : public QObject { Q_OBJECT public: const QStringList branches() const; QVector match(const QString &domain, const QString &requestUrl) const; bool addRule(FilterLeaf *rule, const QString &domain); private: struct Branch { explicit Branch(const QString &host) : domain(host) {} explicit Branch(Branch &&other) : domain(std::move(other.domain)) , leaves(std::move(other.leaves)) {} ~Branch() { qDeleteAll(leaves); } // TODO: replace domain type with domain-matching class Domain domain; //std::string domain; std::vector leaves; }; std::vector m_branches; }; bool loadHostlist(QIODevice &from, FilterTree *tree); #endif // SMOLBOTE_FILTERTREE_H