22 #ifndef DEPENDENCYSORTER_H
23 #define DEPENDENCYSORTER_H
26 #include "utilitiesexceptions.h"
52 template <
class ElementType_t>
112 m_elements(other.m_elements)
124 if (&other ==
this) {
128 m_elements = other.m_elements;
146 const QMap<ElementType, QSet<ElementType> >
elements()
const
159 m_elements[e].insert(d);
170 m_elements[e].unite(QSet<ElementType>::fromList(d));
181 m_elements[e].unite(d);
189 QList<ElementType>
sort()
const
192 if (m_elements.empty()) {
193 return QList<ElementType>();
198 QMap<ElementType, QSet<ElementType> > e = m_elements;
201 QList<ElementType> sortedList;
203 QSet<ElementType> elementsBeingAnalyzed;
205 QList<ElementType> stackElementsBeingAnalyzed;
209 elementsBeingAnalyzed.insert(nextToTake);
213 bool dependencyInList =
false;
217 stackElementsBeingAnalyzed.push_back(nextToTake);
219 dependencyInList =
true;
222 if (elementsBeingAnalyzed.contains(nextToTake)) {
225 elementsBeingAnalyzed.insert(nextToTake);
230 if (!dependencyInList) {
232 sortedList.append(nextToTake);
233 e.remove(nextToTake);
234 elementsBeingAnalyzed.remove(nextToTake);
235 if (!stackElementsBeingAnalyzed.empty()) {
237 nextToTake = stackElementsBeingAnalyzed.takeLast();
241 e[nextToTake].remove(tmp);
242 }
else if (!e.empty()) {
243 nextToTake = e.keys()[0];
259 QList<ElementType> s =
sort();
262 for (
int i = 0; i < s.size(); i++) {
274 QMap<ElementType, QSet<ElementType> > m_elements;