Skip to content

Commit

Permalink
#5623: The MergeOperation should hold strong references on the two ro…
Browse files Browse the repository at this point in the history
…ot nodes, such that they don't get released before the operation reaches end of life
  • Loading branch information
codereader committed May 24, 2021
1 parent a95f159 commit 338d4df
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 8 deletions.
5 changes: 5 additions & 0 deletions libs/scene/merge/ComparisonResult.h
Expand Up @@ -96,6 +96,11 @@ class ComparisonResult
{
return _baseRoot;
}

const scene::IMapRootNodePtr& getSourceRootNode() const
{
return _sourceRoot;
}
};

}
Expand Down
8 changes: 4 additions & 4 deletions libs/scene/merge/MergeOperation.cpp
Expand Up @@ -209,7 +209,7 @@ void MergeOperation::createActionsForEntity(const ComparisonResult::EntityDiffer
break;

case ComparisonResult::EntityDifference::Type::EntityMissingInBase:
addAction(std::make_shared<AddEntityAction>(difference.sourceNode, _targetRoot));
addAction(std::make_shared<AddEntityAction>(difference.sourceNode, _baseRoot));
break;

case ComparisonResult::EntityDifference::Type::EntityPresentButDifferent:
Expand All @@ -228,11 +228,11 @@ void MergeOperation::createActionsForEntity(const ComparisonResult::EntityDiffer
};
}

MergeOperation::Ptr MergeOperation::CreateFromComparisonResult(const ComparisonResult& comparisonResult)
MergeOperation::Ptr MergeOperation::CreateFromComparisonResult(const ComparisonResult& result)
{
auto operation = std::make_shared<MergeOperation>(comparisonResult.getBaseRootNode());
auto operation = std::make_shared<MergeOperation>(result.getSourceRootNode(), result.getBaseRootNode());

for (const auto& difference : comparisonResult.differingEntities)
for (const auto& difference : result.differingEntities)
{
operation->createActionsForEntity(difference);
}
Expand Down
10 changes: 6 additions & 4 deletions libs/scene/merge/MergeOperation.h
Expand Up @@ -12,19 +12,21 @@ namespace merge
{

// A MergeOperation groups one or more merge actions
// together in order to apply a set of changes to an existing map
// together in order to apply a set of changes from source => base
class MergeOperation
{
private:
scene::IMapRootNodePtr _targetRoot;
scene::IMapRootNodePtr _sourceRoot;
scene::IMapRootNodePtr _baseRoot;

std::list<MergeAction::Ptr> _actions;

public:
using Ptr = std::shared_ptr<MergeOperation>;

MergeOperation(scene::IMapRootNodePtr targetRoot) :
_targetRoot(targetRoot)
MergeOperation(scene::IMapRootNodePtr sourceRoot, scene::IMapRootNodePtr baseRoot) :
_sourceRoot(sourceRoot),
_baseRoot(baseRoot)
{}

// Creates the merge operation from the given comparison result.
Expand Down

0 comments on commit 338d4df

Please sign in to comment.