Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Utilities/Mergers/include/Mergers/MergeInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ class MergeInterface
/// \brief Custom merge method.
virtual void merge(MergeInterface* const other) = 0; // const argument

ClassDef(MergeInterface, 0);
/// \brief Lets the child perform any routines after the object was deserialized (e.g. setting the correct ownership)
virtual void postDeserialization(){};

ClassDef(MergeInterface, 1);
};

} // namespace o2::mergers
Expand Down
14 changes: 7 additions & 7 deletions Utilities/Mergers/src/IntegratingMerger.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,19 @@ void IntegratingMerger::run(framework::ProcessingContext& ctx)

for (const DataRef& ref : InputRecordWalker(ctx.inputs())) {
if (ref.header != timerHeader) {
auto other = object_store_helpers::extractObjectFrom(ref);
if (std::holds_alternative<std::monostate>(mMergedObject)) {
mMergedObject = object_store_helpers::extractObjectFrom(ref);

mMergedObject = std::move(object_store_helpers::extractObjectFrom(ref));
} else if (std::holds_alternative<TObjectPtr>(mMergedObject)) {
// We expect that if the first object was TObject, then all should.
auto other = TObjectPtr(framework::DataRefUtils::as<TObject>(ref).release(), algorithm::deleteTCollections);
auto target = std::get<TObjectPtr>(mMergedObject);
algorithm::merge(target.get(), other.get());
auto targetAsTObject = std::get<TObjectPtr>(mMergedObject);
auto otherAsTObject = std::get<TObjectPtr>(other);
algorithm::merge(targetAsTObject.get(), otherAsTObject.get());

} else if (std::holds_alternative<MergeInterfacePtr>(mMergedObject)) {
// We expect that if the first object inherited MergeInterface, then all should.
auto other = framework::DataRefUtils::as<MergeInterface>(ref);
std::get<MergeInterfacePtr>(mMergedObject)->merge(other.get());
auto otherAsMergeInterface = std::get<MergeInterfacePtr>(other);
std::get<MergeInterfacePtr>(mMergedObject)->merge(otherAsMergeInterface.get());
} else {
throw std::runtime_error("mMergedObject' variant has no value.");
}
Expand Down
11 changes: 8 additions & 3 deletions Utilities/Mergers/src/ObjectStore.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,15 @@ ObjectStore extractObjectFrom(const framework::DataRef& ref)
errorPrefix + "Failed to read object with name '" + storedClass->GetName() + "' from message using ROOT serialization.");
}

if (inheritsFromTObject) {
return TObjectPtr(static_cast<TObject*>(object), algorithm::deleteTCollections);
if (inheritsFromMergeInterface) {
MergeInterface* objectAsMergeInterface = inheritsFromTObject ? dynamic_cast<MergeInterface*>(static_cast<TObject*>(object)) : static_cast<MergeInterface*>(object);
if (objectAsMergeInterface == nullptr) {
throw std::runtime_error(errorPrefix + "Could not cast '" + storedClass->GetName() + "' to MergeInterface");
}
objectAsMergeInterface->postDeserialization();
return MergeInterfacePtr(objectAsMergeInterface);
} else {
return MergeInterfacePtr(static_cast<MergeInterface*>(object));
return TObjectPtr(static_cast<TObject*>(object), algorithm::deleteTCollections);
}
}

Expand Down
4 changes: 2 additions & 2 deletions Utilities/Mergers/test/test_ObjectStore.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ BOOST_AUTO_TEST_CASE(TestObjectExtraction)
DataRef ref = makeDataRef(obj);

auto objStore = object_store_helpers::extractObjectFrom(ref);
BOOST_REQUIRE(std::holds_alternative<TObjectPtr>(objStore));
BOOST_REQUIRE(std::holds_alternative<MergeInterfacePtr>(objStore));

auto objExtractedCustom = dynamic_cast<CustomMergeableTObject*>(std::get<TObjectPtr>(objStore).get());
auto objExtractedCustom = dynamic_cast<CustomMergeableTObject*>(std::get<MergeInterfacePtr>(objStore).get());
BOOST_REQUIRE(objExtractedCustom != nullptr);
BOOST_CHECK_EQUAL(objExtractedCustom->getSecret(), 123);

Expand Down