23 #if defined (_WIN32) && !defined (__CYGWIN__) && !defined (__MINGW32__)
105 temp +=
"----------#n#";
110 temp +=
"Source:#n#";
115 temp +=
"Destination:#n#";
120 temp +=
"#n#INCOMPLETE#n#";
122 temp +=
"#n#PATH CHAIN IS UNSOLVED BEFORE THIS POINT#n#";
124 temp +=
"#n#PATH NOT FOUND#n#";
232 if (dependant == NULL)
239 if (dependant == NULL)
256 std::vector< NavPath* >temp;
269 vector< NavPath* >neighbors;
271 deque< const NavPath* >pathStack;
272 pathStack.push_back(
this );
274 while (!pathStack.empty() && !cycle) {
275 v = pathStack.back();
276 pathStack.pop_back();
278 for (i = 0; i < neighbors.size(); ++i) {
279 if (neighbors[i] ==
this) {
283 pathStack.push_back( neighbors[i] );
300 if (originIndex == destIndex) {
301 path.push_back( originIndex );
304 vector< unsigned >prev( systemIter.
size() );
305 vector< unsigned >visited( systemIter.
size(), 0 );
306 deque< unsigned > oriFront, destFront;
309 unsigned midNodePrevOri;
310 unsigned midNodePrevDest;
311 midNodePrevOri = midNodePrevDest = 0;
313 deque< unsigned > *front;
315 if ( originIndex >= visited.size() || destIndex >= visited.size() ) {
316 fprintf( stderr,
"(previously) FATAL error with nav system, referencing value too big %d %d with visited size %d\n",
317 (
int) originIndex, (
int) destIndex, (
int) visited.size() );
320 oriFront.push_back( originIndex );
321 visited[originIndex] = 1;
322 destFront.push_back( destIndex );
323 visited[destIndex] = 2;
324 while (oriFront.size() < max_size && destFront.size() < max_size && !oriFront.empty() && !destFront.empty()
334 unsigned index = front->front();
336 for (
unsigned adjs = 0; adjs < systemIter[
index].GetDestinationSize(); ++adjs) {
337 unsigned adjIndex = systemIter[
index].GetDestinationIndex( adjs );
338 if ( systemIter[adjIndex].isDrawable() ) {
339 if (visited[adjIndex] == 0) {
340 visited[adjIndex] = visitMark;
341 prev[adjIndex] =
index;
342 front->push_back( adjIndex );
343 }
else if (visited[adjIndex] != visitMark) {
346 midNodePrevDest = prev[adjIndex];
347 midNodePrevOri =
index;
349 midNodePrevOri = prev[adjIndex];
350 midNodePrevDest =
index;
360 unsigned index = midNodePrevOri;
361 while (index != originIndex) {
362 path.push_front( index );
364 if (
path.size() >= max_size) {
371 path.push_front( originIndex );
372 if (destIndex == midNode) {
373 path.push_back( destIndex );
375 path.push_back( midNode );
377 unsigned index = midNodePrevDest;
378 while (index != destIndex) {
379 path.push_back( index );
381 if (
path.size() >= max_size) {
388 path.push_back( destIndex );
394 vector< unsigned >prev( systemIter.
size() );
395 vector< bool > visited( systemIter.
size(), false );
397 set< unsigned > origins;
399 unsigned index, destIndex = 0;
400 for (
unsigned i = 0;
i < frontier.size(); ++
i) {
401 index = frontier.front();
402 frontier.pop_front();
403 visited[
index] =
true;
404 frontier.push_back( index );
405 origins.insert( index );
407 path.push_back( index );
411 while (frontier.size() < max_size && !frontier.empty() && !found) {
412 index = frontier.front();
413 frontier.pop_front();
414 for (
unsigned adjs = 0; adjs < systemIter[
index].GetDestinationSize(); ++adjs) {
415 unsigned adjIndex = systemIter[
index].GetDestinationIndex( adjs );
416 if ( !visited[adjIndex] && systemIter[adjIndex].isDrawable() ) {
417 visited[adjIndex] =
true;
418 prev[adjIndex] =
index;
419 frontier.push_back( adjIndex );
422 destIndex = adjIndex;
430 path.push_front( index );
433 path.push_front( index );
434 if (
path.size() >= max_size) {
440 }
while ( !origins.count( index ) );
451 for (list< unsigned >::iterator
i =
path.begin();
i !=
path.end(); ++
i)
452 if ( systemIter[*
i].paths.erase(
this ) )
453 if ( systemIter[*
i].paths.empty() )
454 systemIter[*
i].part_of_path =
false;
467 list< unsigned >::iterator aux;
468 for (list< unsigned >::iterator iter =
path.begin(); iter !=
path.end(); ++iter) {
469 if ( (*iter) !=
path.front() )
471 if ( (*iter) !=
path.back() )
473 systemIter[*iter].part_of_path =
true;
474 systemIter[*iter].paths.insert(
this );
480 map< unsigned, pair< unsigned, unsigned > >::iterator
i =
pathNeighbors.find( system );
483 if ( system !=
path.front() )
484 if ( (*i).second.first == neighbor )
486 if ( system !=
path.back() )
487 if ( (*i).second.second == neighbor )
528 for (std::set< NavPath* >::iterator
i = depList->begin();
i != depList->end(); ++
i) {
529 if ( (*i)->source->getRequiredPath() == this ) {
533 if ( (*i)->destination->getRequiredPath() == this ) {
534 delete (*i)->destination;
535 (*i)->destination = NULL;
550 paths.push_back( path );
556 for (std::vector< NavPath* >::iterator
i =
paths.begin();
i <
paths.end(); ++
i)
557 if ( (*
i) == path ) {
567 for (std::vector< NavPath* >::iterator
i =
paths.begin();
i <
paths.end(); ++
i)
568 (*i)->setVisible(
true );
573 for (std::vector< NavPath* >::iterator
i =
paths.begin();
i <
paths.end(); ++
i)
574 (*i)->setVisible(
false );
587 std::list< NavPath* >::iterator
i;
590 for (std::vector< NavPath* >::iterator
j =
paths.begin();
j <
paths.end(); ++
j) {
591 std::cerr<<
"Updating path: "<<(*j)->getName()<<endl;
596 (*i)->updated =
false;
598 if ( (*i)->updated ==
false && (*i)->isCurrentDependant() ) {
599 std::cerr<<
"Updating path: "<<(*i)->getName()<<endl;
604 (*i)->updated =
false;
606 if ( (*i)->updated ==
false && (*i)->isTargetDependant() ) {
607 std::cerr<<
"Updating path: "<<(*i)->getName()<<endl;
616 for (std::set< NavPath* >::iterator
i = dependants->begin();
i != dependants->end(); ++
i)
623 std::vector< NavPath* >::iterator u;
637 for (std::set< NavPath* >::iterator
v = dependants->begin();
v != dependants->end(); ++
v)
650 for (std::vector< NavPath* >::iterator
i =
paths.begin();
i <
paths.end(); ++
i) {
669 deque< unsigned >temp;
687 deque< unsigned >temp;
705 deque< unsigned >temp;
718 assert( criteria != NULL );
720 string temp =
"Criteria: ";
727 assert( criteria != NULL );
733 assert( criteria != NULL );
747 assert( criteria != NULL );
760 string temp =
"Chain: ";
761 temp += supplierPath->
getName();
765 temp +=
" (Destination)";
767 temp +=
" (All Points)";
773 deque< unsigned >systemDeque;
779 const list< unsigned > *systems = supplierPath->
getAllPoints();
780 for (list< unsigned >::const_iterator
i = systems->begin();
i != systems->end(); ++
i)
781 systemDeque.push_back( *
i );
793 const list< unsigned > *systems = supplierPath->
getAllPoints();
794 for (list< unsigned >::const_iterator
i = systems->begin();
i != systems->end(); ++
i)