* @brief Divide diff blocks to align similar lines in diff blocks. (3-way) */
| 444 | * @brief Divide diff blocks to align similar lines in diff blocks. (3-way) |
| 445 | */ |
| 446 | void CMergeDoc::AdjustDiffBlocks3way() |
| 447 | { |
| 448 | int nDiff; |
| 449 | int nDiffCount = m_diffList.GetSize(); |
| 450 | |
| 451 | // Go through and do our best to line up lines within each diff block |
| 452 | // between left side and right side |
| 453 | DiffList newDiffList; |
| 454 | newDiffList.Clear(); |
| 455 | for (nDiff = 0; nDiff < nDiffCount; nDiff++) |
| 456 | { |
| 457 | const DIFFRANGE & diffrange = *m_diffList.DiffRangeAt(nDiff); |
| 458 | // size map correctly (it will hold one entry for each left-side line |
| 459 | int nlines0 = diffrange.end[0] - diffrange.begin[0] + 1; |
| 460 | int nlines1 = diffrange.end[1] - diffrange.begin[1] + 1; |
| 461 | int nlines2 = diffrange.end[2] - diffrange.begin[2] + 1; |
| 462 | if ((nlines0 > 0) + (nlines1 > 0) + (nlines2 > 0) > 1) |
| 463 | { |
| 464 | // Call worker to do all lines in block |
| 465 | int lo0 = 0, hi0 = nlines0 - 1; |
| 466 | int lo1 = 0, hi1 = nlines1 - 1; |
| 467 | int lo2 = 0, hi2 = nlines2 - 1; |
| 468 | const std::vector<WordDiff> worddiffs01 = GetWordDiffArrayInRange(diffrange.begin, diffrange.end, false, 0, 1); |
| 469 | const std::vector<WordDiff> worddiffs12 = GetWordDiffArrayInRange(diffrange.begin, diffrange.end, false, 1, 2); |
| 470 | const std::vector<WordDiff> worddiffs20 = GetWordDiffArrayInRange(diffrange.begin, diffrange.end, false, 2, 0); |
| 471 | DiffMap diffmap01, diffmap12, diffmap20; |
| 472 | diffmap01.InitDiffMap(nlines0); |
| 473 | diffmap12.InitDiffMap(nlines1); |
| 474 | diffmap20.InitDiffMap(nlines2); |
| 475 | AdjustDiffBlock(diffmap01, diffrange, worddiffs01, 0, 1, lo0, hi0, lo1, hi1); |
| 476 | AdjustDiffBlock(diffmap12, diffrange, worddiffs12, 1, 2, lo1, hi1, lo2, hi2); |
| 477 | AdjustDiffBlock(diffmap20, diffrange, worddiffs20, 2, 0, lo2, hi2, lo0, hi0); |
| 478 | ValidateDiffMap(diffmap01); |
| 479 | ValidateDiffMap(diffmap12); |
| 480 | ValidateDiffMap(diffmap20); |
| 481 | std::vector<std::array<int, 3>> vlines = CreateVirtualLineToRealLineMap3way(diffmap01, diffmap12, diffmap20, nlines0, nlines1, nlines2); |
| 482 | |
| 483 | DIFFOPTIONS diffOptions = {0}; |
| 484 | m_diffWrapper.GetOptions(&diffOptions); |
| 485 | std::vector<OP_TYPE> opary(vlines.size()); |
| 486 | for (size_t i = 0; i < vlines.size(); ++i) |
| 487 | opary[i] = (diffrange.op == OP_TRIVIAL) ? |
| 488 | OP_TRIVIAL : |
| 489 | ComputeOpType3way(vlines, i, diffrange, diffOptions); |
| 490 | // divide diff blocks |
| 491 | int line0 = 0, line1 = 0, line2 = 0; |
| 492 | for (size_t i = 0; i < vlines.size();) |
| 493 | { |
| 494 | DIFFRANGE dr; |
| 495 | size_t ib = i; |
| 496 | OP_TYPE op = opary[i]; |
| 497 | if ((vlines[i][0] != DiffMap::GHOST_MAP_ENTRY) && |
| 498 | (vlines[i][1] != DiffMap::GHOST_MAP_ENTRY) && |
| 499 | (vlines[i][2] != DiffMap::GHOST_MAP_ENTRY)) |
| 500 | { |
| 501 | while (i < vlines.size() && |
| 502 | (vlines[i][0] != DiffMap::GHOST_MAP_ENTRY) && |
| 503 | (vlines[i][1] != DiffMap::GHOST_MAP_ENTRY) && |
nothing calls this directly
no test coverage detected