AusweisApp2
ChainBuilder.h
gehe zur Dokumentation dieser Datei
1 
11 #pragma once
12 
13 
14 #include <QVector>
15 #include <algorithm>
16 #include <functional>
17 
18 
19 namespace governikus
20 {
21 
22 template<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  return std::any_of(mChains.constBegin(), mChains.constEnd(), [&pSubChain] (const QVector<T>& pChain) {
66  return std::search(pChain.constBegin(), pChain.constEnd(), pSubChain.constBegin(), pSubChain.constEnd())
67  != pChain.constEnd();
68  });
69  }
70 
71  protected:
72  QMutableVectorIterator<QVector<T>> getChainIterator()
73  {
74  return QMutableVectorIterator<QVector<T>>(mChains);
75  }
76 
77  public:
78  ChainBuilder(const QVector<T>& pAllElements, const std::function<bool(const T& pChild, const T& pParent)>& pIsChildFunc)
79  : mChains()
80  , mIsChildFunc(pIsChildFunc)
81  {
82  for (const auto& elem : pAllElements)
83  {
84  const QVector<T> chain({elem});
85  if (!isSubChain(chain))
86  {
87  buildChain(pAllElements, chain);
88  }
89  }
90  }
91 
92 
93  const QVector<QVector<T>>& getChains() const
94  {
95  return mChains;
96  }
97 
98 
99 };
100 
101 
102 } // 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:78
QMutableVectorIterator< QVector< T > > getChainIterator()
Definition: ChainBuilder.h:72
const QVector< QVector< T > > & getChains() const
Definition: ChainBuilder.h:93
#define T(v)
Definition: http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16