// cerr << "true" << endl;
//else
// cerr << "false" << endl;
- //if (nodes.size() != (routes.size()) +1)
- // cerr << "ALERT: Misconfigured TaxiRoute : " << nodes.size() << " " << routes.size() << endl;
-
+ if (nodes.size() != (routes.size()) +1) {
+ SG_LOG(SG_GENERAL, SG_ALERT, "ALERT: Misconfigured TaxiRoute : " << nodes.size() << " " << routes.size());
+ exit(1);
+ }
if (currNode == nodes.end())
return false;
*nde = *(currNode);
void FGGroundNetwork::trace(FGTaxiNode *currNode, int end, int depth, double distance)
{
+ // Just check some preconditions of the trace algorithm
+ if (nodesStack.size() != routesStack.size())
+ {
+ SG_LOG(SG_GENERAL, SG_ALERT, "size of nodesStack and routesStack is not equal. NodesStack :"
+ << nodesStack.size() << ". RoutesStack : " << routesStack.size());
+ }
nodesStack.push_back(currNode->getIndex());
totalDistance += distance;
//cerr << "Starting trace " << depth << " total distance: " << totalDistance<< endl;
{
//cerr << "Found route : " << totalDistance << "" << " " << *(nodesStack.end()-1) << endl;
routes.push_back(FGTaxiRoute(nodesStack,routesStack,totalDistance));
+ if (nodesStack.empty() || routesStack.empty())
+ {
+ printRoutingError(string("while finishing route"));
+ }
nodesStack.pop_back();
routesStack.pop_back();
if (!(foundRoute))
i++;
}
if (i != nodesStack.end()-1) {
+ if (nodesStack.empty() || routesStack.empty())
+ {
+ printRoutingError(string("while returning from an already encountered node"));
+ }
nodesStack.pop_back();
routesStack.pop_back();
totalDistance -= distance;
if ((totalDistance > maxDistance) && foundRoute)
{
//cerr << "Stopping rediculously long trace: " << totalDistance << endl;
+ if (nodesStack.empty() || routesStack.empty())
+ {
+ printRoutingError(string("while returning from finding a rediculously long route"));
+ }
nodesStack.pop_back();
routesStack.pop_back();
totalDistance -= distance;
}
else
{
- SG_LOG( SG_GENERAL, SG_DEBUG, "4" );
+ //SG_LOG( SG_GENERAL, SG_DEBUG, "4" );
+ }
+ if (nodesStack.empty())
+ {
+ printRoutingError(string("while finishing trace"));
}
nodesStack.pop_back();
- routesStack.pop_back();
+ // Make sure not to dump the level-zero routesStack entry, because that was never created.
+ if (depth)
+ {
+ routesStack.pop_back();
+ //cerr << "leaving trace " << routesStack.size() << endl;
+ }
totalDistance -= distance;
return;
}
+void FGGroundNetwork::printRoutingError(string mess)
+{
+ SG_LOG(SG_GENERAL, SG_ALERT, "Error in ground network trace algorithm " << mess);
+ if (nodesStack.empty())
+ {
+ SG_LOG(SG_GENERAL, SG_ALERT, " nodesStack is empty. Dumping routesStack");
+ for (intVecIterator i = routesStack.begin() ; i != routesStack.end(); i++)
+ SG_LOG(SG_GENERAL, SG_ALERT, "Route " << (*i));
+ }
+ if (routesStack.empty())
+ {
+ SG_LOG(SG_GENERAL, SG_ALERT, " routesStack is empty. Dumping nodesStack");
+ for (intVecIterator i = nodesStack.begin() ; i != nodesStack.end(); i++)
+ SG_LOG(SG_GENERAL, SG_ALERT, "Node " << (*i));
+ }
+ //exit(1);
+}