std::vector<Segment> IndexGraphStarterJoints<Graph>::ReconstructJoint(JointSegment const & joint) { // We have invisible JointSegments, which are come from start to start or end to end. // They need just for generic algorithm working. So we skip such objects. if (IsInvisible(joint)) return {}; // In case of a fake vertex we return its prebuilt path. if (joint.IsFake()) { auto const it = m_reconstructedFakeJoints.find(joint); CHECK(it != m_reconstructedFakeJoints.cend(), ("Can not find such fake joint")); return it->second; } // Otherwise just reconstruct segment consequently. std::vector<Segment> subpath; Segment currentSegment = joint.GetSegment(true /* start */); Segment lastSegment = joint.GetSegment(false /* start */); bool const forward = currentSegment.GetSegmentIdx() < lastSegment.GetSegmentIdx(); while (currentSegment != lastSegment) { subpath.emplace_back(currentSegment); currentSegment.Next(forward); } subpath.emplace_back(lastSegment); return subpath; }
inline std::string DebugPrint(Segment const & segment) { std::ostringstream out; out << std::boolalpha << "Segment(" << segment.GetMwmId() << ", " << segment.GetFeatureId() << ", " << segment.GetSegmentIdx() << ", " << segment.IsForward() << ")"; return out.str(); }