Add weights to graph edges. Choose between edges based on their weight.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50757 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov
2008-05-06 18:14:24 +00:00
parent d83038c960
commit bb8b58dcf3
3 changed files with 32 additions and 37 deletions

View File

@@ -33,35 +33,37 @@ extern cl::list<std::string> Languages;
namespace {
// Go through the list C and find the edge that isEnabled(); if
// there is no such edge, return the default edge; if there is no
// default edge, throw an exception.
// Return the edge with the maximum weight.
template <class C>
const Edge* ChooseEdge(const C& EdgesContainer,
const std::string& NodeName = "root") {
const Edge* DefaultEdge = 0;
const Edge* MaxEdge = 0;
unsigned MaxWeight = 0;
bool SingleMax = true;
for (typename C::const_iterator B = EdgesContainer.begin(),
E = EdgesContainer.end(); B != E; ++B) {
const Edge* E = B->getPtr();
if (E->isDefault())
if (!DefaultEdge)
DefaultEdge = E;
else
throw std::runtime_error("Node " + NodeName
+ ": multiple default outward edges found!"
" Most probably a specification error.");
if (E->isEnabled())
return E;
unsigned EW = E->Weight();
if (EW > MaxWeight) {
MaxEdge = E;
MaxWeight = EW;
SingleMax = true;
}
else if (EW == MaxWeight) {
SingleMax = false;
}
}
if (DefaultEdge)
return DefaultEdge;
else
throw std::runtime_error("Node " + NodeName
+ ": no default outward edge found!"
if (!SingleMax)
throw std::runtime_error("Node " + NodeName +
": multiple maximal outward edges found!"
" Most probably a specification error.");
if (!MaxEdge)
throw std::runtime_error("Node " + NodeName +
": no maximal outward edge found!"
" Most probably a specification error.");
return MaxEdge;
}
}