MCPcopy Create free account
hub / github.com/WinMerge/winmerge / AdjustDiffBlocks3way

Method AdjustDiffBlocks3way

Src/MergeDocDiffSync.cpp:446–680  ·  view source on GitHub ↗

* @brief Divide diff blocks to align similar lines in diff blocks. (3-way) */

Source from the content-addressed store, hash-verified

444 * @brief Divide diff blocks to align similar lines in diff blocks. (3-way)
445 */
446void 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) &&

Callers

nothing calls this directly

Calls 10

ValidateDiffMapFunction · 0.85
assertClass · 0.85
DiffRangeAtMethod · 0.80
InitDiffMapMethod · 0.80
AddDiffMethod · 0.80
GetSizeMethod · 0.45
ClearMethod · 0.45
GetOptionsMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected