@@ -281,13 +281,14 @@ void buildPerLibrary(const TopDown* node, PerLibraryResults& results, QHash<QStr
281281 }
282282}
283283
284- void diffBottomUpResults (const BottomUp& a, const BottomUp* b, BottomUp* result_node, const Costs& costs_a,
285- const Costs& costs_b, Costs* costs_result)
284+ template <typename ResultType, bool addResultNode = true >
285+ void diffResults (const ResultType& a, const ResultType* b, ResultType* result_node, const Costs& costs_a,
286+ const Costs& costs_b, Costs* costs_result)
286287{
287288 for (const auto & node : a.children ) {
288289 const auto sibling = b->entryForSymbol (node.symbol );
289290 if (sibling) {
290- BottomUp diffed;
291+ ResultType diffed;
291292 diffed.id = node.id ;
292293 diffed.symbol = node.symbol ;
293294
@@ -296,8 +297,10 @@ void diffBottomUpResults(const BottomUp& a, const BottomUp* b, BottomUp* result_
296297 costs_result->add (2 * i + 1 , diffed.id , costs_b.cost (i, sibling->id ));
297298 }
298299
299- result_node->children .push_back (diffed);
300- diffBottomUpResults (node, sibling, &result_node->children .back (), costs_a, costs_b, costs_result);
300+ if (addResultNode) {
301+ result_node->children .push_back (diffed);
302+ }
303+ diffResults (node, sibling, &result_node->children .back (), costs_a, costs_b, costs_result);
301304 }
302305 }
303306}
@@ -309,7 +312,7 @@ QString Data::prettifySymbol(const QString& name)
309312 return result == name ? name : result;
310313}
311314
312- TopDownResults TopDownResults::fromBottomUp (const BottomUpResults& bottomUpData, bool skipFirstLevel)
315+ TopDownResults Data:: TopDownResults::fromBottomUp (const BottomUpResults& bottomUpData, bool skipFirstLevel)
313316{
314317 TopDownResults results;
315318 results.selfCosts .initializeCostsFrom (bottomUpData.costs );
@@ -435,9 +438,50 @@ Data::BottomUpResults BottomUpResults::diffBottomUpResults(const Data::BottomUpR
435438 results.costs .addTotalCost (costBType, b.costs .totalCost (0 ));
436439 }
437440
438- ::diffBottomUpResults (a.root, &b.root, &results.root, a.costs, b.costs, &results.costs);
441+ diffResults (a.root , &b.root , &results.root , a.costs , b.costs , &results.costs );
439442
440443 BottomUp::initializeParents (&results.root );
441444
442445 return results;
443446}
447+
448+ TopDownResults TopDownResults::diffTopDownResults (const TopDownResults& a, const TopDownResults& b)
449+ {
450+ if (a.selfCosts .numTypes () != b.selfCosts .numTypes ()) {
451+ return {};
452+ }
453+
454+ TopDownResults results;
455+
456+ for (int i = 0 ; i < a.selfCosts .numTypes (); i++) {
457+ // only diff same type of costs
458+ if (a.selfCosts .typeName (i) != b.selfCosts .typeName (i)) {
459+ return {};
460+ }
461+
462+ results.selfCosts .addType (2 * i, QLatin1String (" baseline %1" ).arg (a.selfCosts .typeName (i)),
463+ a.selfCosts .unit (i));
464+ results.selfCosts .addTotalCost (2 * i, a.selfCosts .totalCost (i));
465+
466+ results.inclusiveCosts .addType (2 * i, QLatin1String (" baseline %1" ).arg (a.inclusiveCosts .typeName (i)),
467+ a.inclusiveCosts .unit (i));
468+ results.inclusiveCosts .addTotalCost (2 * i, a.inclusiveCosts .totalCost (i));
469+
470+ const auto costBType = 2 * i + 1 ;
471+ results.selfCosts .addType (costBType, QLatin1String (" ratio of %1" ).arg (b.selfCosts .typeName (i)),
472+ Costs::Unit::Unknown);
473+ results.selfCosts .addTotalCost (costBType, b.selfCosts .totalCost (0 ));
474+
475+ results.inclusiveCosts .addType (costBType, QLatin1String (" ratio of %1" ).arg (b.inclusiveCosts .typeName (i)),
476+ Costs::Unit::Unknown);
477+ results.inclusiveCosts .addTotalCost (costBType, b.inclusiveCosts .totalCost (0 ));
478+ }
479+
480+ diffResults (a.root , &b.root , &results.root , a.selfCosts , b.selfCosts , &results.selfCosts );
481+ diffResults<TopDown, false >(a.root , &b.root , &results.root , a.inclusiveCosts , b.inclusiveCosts ,
482+ &results.inclusiveCosts );
483+
484+ Data::TopDown::initializeParents (&results.root );
485+
486+ return results;
487+ }
0 commit comments