27 QList<QList<T>> mChains;
28 std::function<bool(
const T& pChild,
const T& pParent)> mIsChildFunc;
30 void buildChain(
const QList<T>& pAllElements,
const QList<T>& pChain)
32 bool chainComplete =
true;
34 for (
const auto& elem : pAllElements)
36 if (pChain.contains(elem))
41 if (mIsChildFunc(elem, pChain.last()))
43 QList<T> extendedChain(pChain);
44 extendedChain += elem;
45 buildChain(pAllElements, extendedChain);
46 chainComplete =
false;
48 else if (mIsChildFunc(pChain.first(), elem))
50 QList<T> extendedChain({elem});
51 extendedChain += pChain;
52 buildChain(pAllElements, extendedChain);
53 chainComplete =
false;
57 if (chainComplete && !isSubChain(pChain))
64 bool isSubChain(
const QList<T>& pSubChain)
66 return std::any_of(mChains.constBegin(), mChains.constEnd(), [&pSubChain] (
const QList<T>& pChain) {
67 return std::search(pChain.constBegin(), pChain.constEnd(), pSubChain.constBegin(), pSubChain.constEnd())
75 return QMutableListIterator<QList<T>>(mChains);
79 ChainBuilder(
const QList<T>& pAllElements,
const std::function<
bool(
const T& pChild,
const T& pParent)>& pIsChildFunc)
81 , mIsChildFunc(pIsChildFunc)
83 for (
const auto& elem : pAllElements)
85 const QList<T> chain({elem});
86 if (!isSubChain(chain))
88 buildChain(pAllElements, chain);