19 QList<QList<T>> mChains;
20 std::function<bool(
const T& pChild,
const T& pParent)> mIsChildFunc;
22 void buildChain(
const QList<T>& pAllElements,
const QList<T>& pChain)
24 bool chainComplete =
true;
26 for (
const auto& elem : pAllElements)
28 if (pChain.contains(elem))
33 if (mIsChildFunc(elem, pChain.last()))
35 QList<T> extendedChain(pChain);
36 extendedChain += elem;
37 buildChain(pAllElements, extendedChain);
38 chainComplete =
false;
40 else if (mIsChildFunc(pChain.first(), elem))
42 QList<T> extendedChain({elem});
43 extendedChain += pChain;
44 buildChain(pAllElements, extendedChain);
45 chainComplete =
false;
49 if (chainComplete && !isSubChain(pChain))
56 bool isSubChain(
const QList<T>& pSubChain)
58 return std::any_of(mChains.constBegin(), mChains.constEnd(), [&pSubChain] (
const QList<T>& pChain) {
59 return std::search(pChain.constBegin(), pChain.constEnd(), pSubChain.constBegin(), pSubChain.constEnd())
67 return QMutableListIterator<QList<T>>(mChains);
71 ChainBuilder(
const QList<T>& pAllElements,
const std::function<
bool(
const T& pChild,
const T& pParent)>& pIsChildFunc)
73 , mIsChildFunc(pIsChildFunc)
75 for (
const auto& elem : pAllElements)
77 const QList<T> chain({elem});
78 if (!isSubChain(chain))
80 buildChain(pAllElements, chain);