/
MergeOperationBase.cpp
90 lines (73 loc) · 2.36 KB
/
MergeOperationBase.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "MergeOperationBase.h"
#include "itextstream.h"
namespace scene
{
namespace merge
{
void MergeOperationBase::addAction(const IMergeAction::Ptr& action)
{
_actions.push_back(action);
}
void MergeOperationBase::applyActions()
{
for (auto& action : _actions)
{
try
{
action->applyChanges();
}
catch (const std::runtime_error& ex)
{
rError() << "Failed to apply action: " << ex.what() << std::endl;
}
}
}
bool MergeOperationBase::hasActions()
{
return !_actions.empty();
}
void MergeOperationBase::foreachAction(const std::function<void(const IMergeAction::Ptr&)>& visitor)
{
for (const auto& action : _actions)
{
visitor(action);
}
}
void MergeOperationBase::clearActions()
{
_actions.clear();
}
void MergeOperationBase::addActionForKeyValueDiff(const ComparisonResult::KeyValueDifference& difference,
const scene::INodePtr& targetEntity)
{
addAction(createActionForKeyValueDiff(difference, targetEntity));
}
MergeAction::Ptr MergeOperationBase::createActionForKeyValueDiff(const ComparisonResult::KeyValueDifference& difference,
const scene::INodePtr& targetEntity)
{
switch (difference.type)
{
case ComparisonResult::KeyValueDifference::Type::KeyValueAdded:
return std::make_shared<AddEntityKeyValueAction>(targetEntity, difference.key, difference.value);
case ComparisonResult::KeyValueDifference::Type::KeyValueRemoved:
return std::make_shared<RemoveEntityKeyValueAction>(targetEntity, difference.key);
case ComparisonResult::KeyValueDifference::Type::KeyValueChanged:
return std::make_shared<ChangeEntityKeyValueAction>(targetEntity, difference.key, difference.value);
}
throw std::logic_error("Unhandled key value diff type in MergeOperationBase::createActionForKeyValueDiff");
}
void MergeOperationBase::addActionsForPrimitiveDiff(const ComparisonResult::PrimitiveDifference& difference,
const scene::INodePtr& targetEntity)
{
switch (difference.type)
{
case ComparisonResult::PrimitiveDifference::Type::PrimitiveAdded:
addAction(std::make_shared<AddChildAction>(difference.node, targetEntity));
break;
case ComparisonResult::PrimitiveDifference::Type::PrimitiveRemoved:
addAction(std::make_shared<RemoveChildAction>(difference.node));
break;
}
}
}
}