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  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