29 std::function<bool(const T& pChild, const T& pParent)> mIsChildFunc;
31 void buildChain(
const QVector<T>& pAllElements,
const QVector<T>& pChain)
33 bool chainComplete =
true;
35 for (
const auto& elem : pAllElements)
37 if (pChain.contains(elem))
42 if (mIsChildFunc(elem, pChain.last()))
44 QVector<T> extendedChain(pChain);
45 extendedChain += elem;
46 buildChain(pAllElements, extendedChain);
47 chainComplete =
false;
49 else if (mIsChildFunc(pChain.first(), elem))
51 QVector<T> extendedChain(pChain);
52 extendedChain.prepend(elem);
53 buildChain(pAllElements, extendedChain);
54 chainComplete =
false;
58 if (chainComplete && !isSubChain(pChain))
65 bool isSubChain(
const QVector<T>& pSubChain)
67 for (
const auto& chain : qAsConst(
mChains))
69 if (std::search(chain.begin(), chain.end(), pSubChain.begin(), pSubChain.end()) != chain.end())
79 ChainBuilder(
const QVector<T>& pAllElements,
const std::function<
bool(
const T& pChild,
const T& pParent)>& pIsChildFunc)
81 , mIsChildFunc(pIsChildFunc)
83 for (
const auto& elem : pAllElements)
85 const QVector<T> chain({elem});
86 if (!isSubChain(chain))
88 buildChain(pAllElements, chain);
Definition: ChainBuilder.h:23
const QVector< QVector< T > > & getChains() const
Definition: ChainBuilder.h:94
QVector< QVector< T > > mChains
Definition: ChainBuilder.h:26
#define T(v)
Definition: http_parser.cpp:234