AusweisApp2
ChainBuilder.h
gehe zur Dokumentation dieser Datei
1 
11 #pragma once
12 
13 
14 #include <algorithm>
15 #include <functional>
16 #include <QVector>
17 
18 
19 namespace governikus
20 {
21 
22 template<typename T>
24 {
25  protected:
26  QVector<QVector<T>> mChains;
27 
28  private:
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  for (const auto& chain : qAsConst(mChains))
68  {
69  if (std::search(chain.begin(), chain.end(), pSubChain.begin(), pSubChain.end()) != chain.end())
70  {
71  return true;
72  }
73  }
74  return false;
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
const QVector< QVector< T > > & getChains() const
Definition: ChainBuilder.h:93
QVector< QVector< T > > mChains
Definition: ChainBuilder.h:26
#define T(v)
Definition: http_parser.cpp:237
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:15