AusweisApp2
 Alle Klassen Namensbereiche Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Propertys Freundbeziehungen Makrodefinitionen
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(pChain);
52  extendedChain.prepend(elem);
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 
78  public:
79  ChainBuilder(const QVector<T>& pAllElements, const std::function<bool(const T& pChild, const T& pParent)>& pIsChildFunc)
80  : mChains()
81  , mIsChildFunc(pIsChildFunc)
82  {
83  for (const auto& elem : pAllElements)
84  {
85  const QVector<T> chain({elem});
86  if (!isSubChain(chain))
87  {
88  buildChain(pAllElements, chain);
89  }
90  }
91  }
92 
93 
94  const QVector<QVector<T> >& getChains() const
95  {
96  return mChains;
97  }
98 
99 
100 };
101 
102 
103 } /* namespace governikus */
Definition: ChainBuilder.h:23
const QVector< QVector< T > > & getChains() const
Definition: ChainBuilder.h:94
QVector< QVector< T > > mChains
Definition: ChainBuilder.h:26
#define T(v)
Definition: http_parser.cpp:234