File indexing completed on 2024-05-12 05:43:21

0001 /*
0002  * SPDX-FileCopyrightText: 2022 Pablo Rauzy <r .at. uzy.me>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 #ifndef MAKEFILEACTIONS_TARGET_H
0007 #define MAKEFILEACTIONS_TARGET_H
0008 
0009 #include <QDebug>
0010 #include <QList>
0011 #include <QString>
0012 
0013 class TargetTree {
0014 public:
0015     TargetTree() : m_isTarget(false){};
0016 
0017     TargetTree(const QString &prefix, bool isTarget)
0018         : m_prefix(prefix)
0019         , m_isTarget(isTarget){};
0020 
0021     bool isTarget() const
0022     {
0023         return m_isTarget;
0024     };
0025 
0026     QString prefix() const
0027     {
0028         return m_prefix;
0029     };
0030 
0031     QList<TargetTree> children() const
0032     {
0033         return m_children;
0034     };
0035 
0036     bool insert(const QString &prefix, bool isTarget)
0037     {
0038         if (!prefix.startsWith(m_prefix)) { // nothing to do here
0039             return false;
0040         }
0041         if (prefix == m_prefix) { // already there
0042             if (isTarget) {
0043                 m_isTarget = true;
0044             }
0045             return true;
0046         }
0047         // can we go deeper?
0048         for (auto &child : m_children) {
0049             if (child.insert(prefix, isTarget)) {
0050                 return true;
0051             }
0052         }
0053         // if we couldn't, insert here
0054         m_children.append(TargetTree(prefix, isTarget));
0055         return true;
0056     };
0057 
0058     static bool cmp(const TargetTree &a, const TargetTree &b) {
0059         return (a.m_children.isEmpty() && !b.m_children.isEmpty())
0060             || (a.m_children.isEmpty() && (a.m_prefix < b.m_prefix))
0061             || (a.m_prefix < b.m_prefix);
0062     };
0063 
0064     friend QDebug operator<<(QDebug dbg, const TargetTree &t)
0065     {
0066         static int indent = 0;
0067         dbg << QString(indent, QLatin1Char(' ')) << t.m_prefix << (t.m_isTarget ? "@\n" : "\n");
0068         indent += 2;
0069         for (const TargetTree &c : t.m_children) {
0070             dbg << c;
0071         }
0072         indent -= 2;
0073         return dbg;
0074     };
0075 
0076 private:
0077     QString m_prefix;
0078     bool m_isTarget;
0079     QList<TargetTree> m_children;
0080 };
0081 
0082 #endif