AusweisApp
Lade ...
Suche ...
Keine Treffer
ChainBuilder.h
gehe zur Dokumentation dieser Datei
1
5#pragma once
6
7#include <QList>
8#include <algorithm>
9#include <functional>
10
11
12namespace governikus
13{
14
15template<typename T>
17{
18 private:
19 QList<QList<T>> mChains;
20 std::function<bool(const T& pChild, const T& pParent)> mIsChildFunc;
21
22 void buildChain(const QList<T>& pAllElements, const QList<T>& pChain)
23 {
24 bool chainComplete = true;
25
26 for (const auto& elem : pAllElements)
27 {
28 if (pChain.contains(elem))
29 {
30 continue;
31 }
32
33 if (mIsChildFunc(elem, pChain.last()))
34 {
35 QList<T> extendedChain(pChain);
36 extendedChain += elem;
37 buildChain(pAllElements, extendedChain);
38 chainComplete = false;
39 }
40 else if (mIsChildFunc(pChain.first(), elem))
41 {
42 QList<T> extendedChain({elem});
43 extendedChain += pChain;
44 buildChain(pAllElements, extendedChain);
45 chainComplete = false;
46 }
47 }
48
49 if (chainComplete && !isSubChain(pChain))
50 {
51 mChains += pChain;
52 }
53 }
54
55
56 bool isSubChain(const QList<T>& pSubChain)
57 {
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())
60 != pChain.constEnd();
61 });
62 }
63
64 protected:
65 QMutableListIterator<QList<T>> getChainIterator()
66 {
67 return QMutableListIterator<QList<T>>(mChains);
68 }
69
70 public:
71 ChainBuilder(const QList<T>& pAllElements, const std::function<bool(const T& pChild, const T& pParent)>& pIsChildFunc)
72 : mChains()
73 , mIsChildFunc(pIsChildFunc)
74 {
75 for (const auto& elem : pAllElements)
76 {
77 const QList<T> chain({elem});
78 if (!isSubChain(chain))
79 {
80 buildChain(pAllElements, chain);
81 }
82 }
83 }
84
85
86 const QList<QList<T>>& getChains() const
87 {
88 return mChains;
89 }
90
91
92};
93
94
95} // namespace governikus
Definition ChainBuilder.h:17
const QList< QList< T > > & getChains() const
Definition ChainBuilder.h:86
QMutableListIterator< QList< T > > getChainIterator()
Definition ChainBuilder.h:65
ChainBuilder(const QList< T > &pAllElements, const std::function< bool(const T &pChild, const T &pParent)> &pIsChildFunc)
Definition ChainBuilder.h:71
#define T(v)
Definition http_parser.cpp:237
Defines the AccessRight and AccessRole enum.
Definition CommandApdu.h:17