aboutsummaryrefslogtreecommitdiffstats
path: root/overloaddata.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-03-03 15:10:06 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-03-18 19:45:06 -0300
commit7dc3fd531da613df2ffee3ae152c316021bb0e2a (patch)
tree99a362aa19be5205f09fdca0ed23fa130199992e /overloaddata.cpp
parent10872ead263959d103eea17507f6ccd16757e8b6 (diff)
Remove boost::graph dependency from Shiboken generator.
Diffstat (limited to 'overloaddata.cpp')
-rw-r--r--overloaddata.cpp46
1 files changed, 26 insertions, 20 deletions
diff --git a/overloaddata.cpp b/overloaddata.cpp
index fe7b643c8..11a2b6eaf 100644
--- a/overloaddata.cpp
+++ b/overloaddata.cpp
@@ -22,13 +22,11 @@
*/
#include <QtCore/QFile>
+#include <reporthandler.h>
+#include <graph.h>
#include "overloaddata.h"
#include "shibokengenerator.h"
-#include <boost/graph/topological_sort.hpp>
-#include <boost/graph/adjacency_list.hpp>
-#include <boost/graph/graph_traits.hpp>
-
/**
* Topologically sort the overloads by implicit convertion order
*
@@ -69,7 +67,8 @@ void OverloadData::sortNextOverloads()
}
// Create the graph of type dependencies based on implicity conversions.
- QSet<QPair<int, int> > deps;
+ Graph graph(reverseMap.count());
+
foreach(OverloadData* ov, m_nextOverloadData) {
const AbstractMetaType* targetType = ov->argType();
foreach(AbstractMetaFunction* function, m_generator->implicitConversions(ov->argType())) {
@@ -87,11 +86,8 @@ void OverloadData::sortNextOverloads()
// If a reverse pair already exists, remove it. Probably due to the
// container check (This happened to QVariant and QHash)
- QPair<int, int> reversePair = qMakePair(convertibleTypeId, targetTypeId);
- if (deps.contains(reversePair))
- deps.remove(reversePair);
-
- deps << qMakePair(targetTypeId, convertibleTypeId);
+ graph.removeEdge(targetTypeId, convertibleTypeId);
+ graph.addEdge(convertibleTypeId, targetTypeId);
}
if (targetType->hasInstantiations()) {
@@ -100,32 +96,42 @@ void OverloadData::sortNextOverloads()
int target = map[targetType->typeEntry()->name()];
int convertible = map[instantiation->typeEntry()->name()];
- if (!deps.contains(qMakePair(convertible, target))) // Avoid cyclic dependency.
- deps << qMakePair(target, convertible);
+ if (!graph.containsEdge(target, convertible)) // Avoid cyclic dependency.
+ graph.addEdge(convertible, target);
}
}
}
/* Add dependency on PyObject, so its check is the last one (too generic) */
if (checkPyObject && !targetType->typeEntry()->name().contains("PyObject")) {
- deps << qMakePair(pyobjectIndex,
- map[targetType->typeEntry()->name()]);
+ graph.addEdge(map[targetType->typeEntry()->name()], pyobjectIndex);
}
}
// Special case for double(int i) (not tracked by m_generator->implicitConversions
if (map.contains("int")) {
+ if (map.contains("float"))
+ graph.addEdge(map["float"], map["int"]);
+ if (map.contains("double"))
+ graph.addEdge(map["double"], map["int"]);
+ if (map.contains("bool"))
+ graph.addEdge(map["bool"], map["int"]);
+ }
+
+ if (map.contains("long")) {
+ if (map.contains("float"))
+ graph.addEdge(map["float"], map["long"]);
if (map.contains("double"))
- deps << qMakePair(map["int"], map["double"]);
+ graph.addEdge(map["double"], map["long"]);
if (map.contains("bool"))
- deps << qMakePair(map["int"], map["bool"]);
+ graph.addEdge(map["bool"], map["long"]);
}
// sort the overloads topologicaly based on the deps graph.
- typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS> Graph;
- Graph g(deps.begin(), deps.end(), reverseMap.size());
- QList<int> unmappedResult;
- boost::topological_sort(g, std::back_inserter(unmappedResult));
+
+ QLinkedList<int> unmappedResult = graph.topologicalSort();
+ if (unmappedResult.isEmpty())
+ ReportHandler::warning("Cyclic dependency found on overloaddata!");
m_nextOverloadData.clear();
foreach(int i, unmappedResult)