@@ -559,33 +559,34 @@ class PathOverIncidentVert
559559 Triangulation& faceToVertices;
560560 // all iterators in [vertexBegIt, vertexEndIt) must have the same central vertex
561561 std::vector<IncidentVert>::iterator vertexBegIt, vertexEndIt;
562- size_t lastUnvisitedIndex = 0 ; // pivot index. [vertexBegIt, vertexBegIt + lastUnvisitedIndex ) - unvisited vertices
562+ size_t firstUnvisitedIndex = 0 ; // pivot index. [vertexBegIt + firstUnvistedIndex, vertexBegIt ) - unvisited vertices
563563
564564public:
565565 PathOverIncidentVert ( Triangulation& triangleToVertices,
566566 std::vector<IncidentVert>& incidentItemsVector, size_t beg, size_t end )
567567 : faceToVertices( triangleToVertices )
568568 , vertexBegIt( incidentItemsVector.begin() + beg )
569569 , vertexEndIt( incidentItemsVector.begin() + end )
570- , lastUnvisitedIndex( end - beg )
571570 {}
572571
573572 // false if there are some unvisited vertices
574573 bool empty () const
575574 {
576- return lastUnvisitedIndex <= 0 ;
575+ return vertexBegIt + firstUnvisitedIndex >= vertexEndIt ;
577576 }
578577
579578 // first unvisited vertex
580579 VertId getFirstVertex () const
581580 {
581+ assert ( !empty () );
582+ const auto first = vertexBegIt + firstUnvisitedIndex;
582583 // below selection ensures that getNextIncidentVertex( getFirstVertex(), true ) will find nextVertex in the very first triangle
583- const auto & vs = faceToVertices[vertexBegIt ->f ];
584- if ( vs[0 ] == vertexBegIt ->srcVert )
584+ const auto & vs = faceToVertices[first ->f ];
585+ if ( vs[0 ] == first ->srcVert )
585586 return vs[1 ];
586- if ( vs[1 ] == vertexBegIt ->srcVert )
587+ if ( vs[1 ] == first ->srcVert )
587588 return vs[2 ];
588- if ( vs[2 ] == vertexBegIt ->srcVert )
589+ if ( vs[2 ] == first ->srcVert )
589590 return vs[0 ];
590591 assert ( false );
591592 return {};
@@ -594,11 +595,11 @@ class PathOverIncidentVert
594595 // find incident unvisited vertex, in case of several option prefer finding the vertex not equal to preVertex
595596 VertId getNextIncidentVertex ( VertId v, bool triOrientation, VertId prevVertex = {} )
596597 {
597- if ( lastUnvisitedIndex <= 0 )
598+ if ( empty () )
598599 return VertId ( -1 );
599600
600- auto prevIt = vertexBegIt + lastUnvisitedIndex ;
601- for ( auto it = vertexBegIt; it < vertexBegIt + lastUnvisitedIndex ; ++it )
601+ auto prevIt = vertexEndIt ;
602+ for ( auto it = vertexBegIt + firstUnvisitedIndex ; it < vertexEndIt ; ++it )
602603 {
603604 VertId nextVertex;
604605 const auto & vs = faceToVertices[it->f ];
@@ -624,19 +625,21 @@ class PathOverIncidentVert
624625 {
625626 if ( nextVertex != prevVertex )
626627 {
627- --lastUnvisitedIndex;
628- std::iter_swap ( it, vertexBegIt + lastUnvisitedIndex );
628+ if ( it != vertexBegIt + firstUnvisitedIndex )
629+ std::iter_swap ( it, vertexBegIt + firstUnvisitedIndex );
630+ ++firstUnvisitedIndex;
629631 return nextVertex;
630632 }
631633 // prevVertex is a possible continuation, store it, and search for other options
632634 prevIt = it;
633635 }
634636 }
635- if ( prevIt < vertexBegIt + lastUnvisitedIndex )
637+ if ( prevIt < vertexEndIt )
636638 {
637639 // the only option is return in prevVertex
638- --lastUnvisitedIndex;
639- std::iter_swap ( prevIt, vertexBegIt + lastUnvisitedIndex );
640+ if ( prevIt != vertexBegIt + firstUnvisitedIndex )
641+ std::iter_swap ( prevIt, vertexBegIt + firstUnvisitedIndex );
642+ ++firstUnvisitedIndex;
640643 return prevVertex;
641644 }
642645 return {};
@@ -654,7 +657,7 @@ class PathOverIncidentVert
654657
655658 for ( size_t i = 1 ; i < path.size (); ++i )
656659 {
657- for ( auto it = vertexBegIt + lastUnvisitedIndex ; it < vertexEndIt ; ++it )
660+ for ( auto it = vertexBegIt; it < vertexBegIt + firstUnvisitedIndex ; ++it )
658661 {
659662 VertId v1, v2;
660663 bool alreadyDuplicted = true ;
0 commit comments