diff --git a/Utilities/Mergers/include/Mergers/MergeInterface.h b/Utilities/Mergers/include/Mergers/MergeInterface.h index f3a1c6656d476..5f614136a6520 100644 --- a/Utilities/Mergers/include/Mergers/MergeInterface.h +++ b/Utilities/Mergers/include/Mergers/MergeInterface.h @@ -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 diff --git a/Utilities/Mergers/src/IntegratingMerger.cxx b/Utilities/Mergers/src/IntegratingMerger.cxx index dce3f4256f881..b9eeea725ff0b 100644 --- a/Utilities/Mergers/src/IntegratingMerger.cxx +++ b/Utilities/Mergers/src/IntegratingMerger.cxx @@ -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(mMergedObject)) { - mMergedObject = object_store_helpers::extractObjectFrom(ref); - + mMergedObject = std::move(object_store_helpers::extractObjectFrom(ref)); } else if (std::holds_alternative(mMergedObject)) { // We expect that if the first object was TObject, then all should. - auto other = TObjectPtr(framework::DataRefUtils::as(ref).release(), algorithm::deleteTCollections); - auto target = std::get(mMergedObject); - algorithm::merge(target.get(), other.get()); + auto targetAsTObject = std::get(mMergedObject); + auto otherAsTObject = std::get(other); + algorithm::merge(targetAsTObject.get(), otherAsTObject.get()); } else if (std::holds_alternative(mMergedObject)) { // We expect that if the first object inherited MergeInterface, then all should. - auto other = framework::DataRefUtils::as(ref); - std::get(mMergedObject)->merge(other.get()); + auto otherAsMergeInterface = std::get(other); + std::get(mMergedObject)->merge(otherAsMergeInterface.get()); } else { throw std::runtime_error("mMergedObject' variant has no value."); } diff --git a/Utilities/Mergers/src/ObjectStore.cxx b/Utilities/Mergers/src/ObjectStore.cxx index ddc0d47f0ccf5..43bc400a0387e 100644 --- a/Utilities/Mergers/src/ObjectStore.cxx +++ b/Utilities/Mergers/src/ObjectStore.cxx @@ -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(object), algorithm::deleteTCollections); + if (inheritsFromMergeInterface) { + MergeInterface* objectAsMergeInterface = inheritsFromTObject ? dynamic_cast(static_cast(object)) : static_cast(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(object)); + return TObjectPtr(static_cast(object), algorithm::deleteTCollections); } } diff --git a/Utilities/Mergers/test/test_ObjectStore.cxx b/Utilities/Mergers/test/test_ObjectStore.cxx index bc2939c904e2c..7c3bd019ce45b 100644 --- a/Utilities/Mergers/test/test_ObjectStore.cxx +++ b/Utilities/Mergers/test/test_ObjectStore.cxx @@ -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(objStore)); + BOOST_REQUIRE(std::holds_alternative(objStore)); - auto objExtractedCustom = dynamic_cast(std::get(objStore).get()); + auto objExtractedCustom = dynamic_cast(std::get(objStore).get()); BOOST_REQUIRE(objExtractedCustom != nullptr); BOOST_CHECK_EQUAL(objExtractedCustom->getSecret(), 123);