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