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