AusweisApp2
Lade ...
Suche ...
Keine Treffer
ChainBuilder.h
gehe zur Dokumentation dieser Datei
1
11#pragma once
12
13
14#include <QVector>
15#include <algorithm>
16#include <functional>
17
18
19namespace governikus
20{
21
22template<typename T>
24{
25 private:
26 QVector<QVector<T>> mChains;
27 std::function<bool(const T& pChild, const T& pParent)> mIsChildFunc;
28
29 void buildChain(const QVector<T>& pAllElements, const QVector<T>& pChain)
30 {
31 bool chainComplete = true;
32
33 for (const auto& elem : pAllElements)
34 {
35 if (pChain.contains(elem))
36 {
37 continue;
38 }
39
40 if (mIsChildFunc(elem, pChain.last()))
41 {
42 QVector<T> extendedChain(pChain);
43 extendedChain += elem;
44 buildChain(pAllElements, extendedChain);
45 chainComplete = false;
46 }
47 else if (mIsChildFunc(pChain.first(), elem))
48 {
49 QVector<T> extendedChain({elem});
50 extendedChain += pChain;
51 buildChain(pAllElements, extendedChain);
52 chainComplete = false;
53 }
54 }
55
56 if (chainComplete && !isSubChain(pChain))
57 {
58 mChains += pChain;
59 }
60 }
61
62
63 bool isSubChain(const QVector<T>& pSubChain)
64 {
65 for (const auto& chain : qAsConst(mChains))
66 {
67 if (std::search(chain.begin(), chain.end(), pSubChain.begin(), pSubChain.end()) != chain.end())
68 {
69 return true;
70 }
71 }
72 return false;
73 }
74
75 protected:
76 QMutableVectorIterator<QVector<T>> getChainIterator()
77 {
78 return QMutableVectorIterator<QVector<T>>(mChains);
79 }
80
81 public:
82 ChainBuilder(const QVector<T>& pAllElements, const std::function<bool(const T& pChild, const T& pParent)>& pIsChildFunc)
83 : mChains()
84 , mIsChildFunc(pIsChildFunc)
85 {
86 for (const auto& elem : pAllElements)
87 {
88 const QVector<T> chain({elem});
89 if (!isSubChain(chain))
90 {
91 buildChain(pAllElements, chain);
92 }
93 }
94 }
95
96
97 const QVector<QVector<T>>& getChains() const
98 {
99 return mChains;
100 }
101
102
103};
104
105
106} // namespace governikus
Definition: ChainBuilder.h:24
ChainBuilder(const QVector< T > &pAllElements, const std::function< bool(const T &pChild, const T &pParent)> &pIsChildFunc)
Definition: ChainBuilder.h:82
QMutableVectorIterator< QVector< T > > getChainIterator()
Definition: ChainBuilder.h:76
const QVector< QVector< T > > & getChains() const
Definition: ChainBuilder.h:97
#define T(v)
Definition: http_parser.cpp:237
A simple template renderer.
Definition: ActivationContext.h:15