-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #39391 from makortel/moduleTypeResolverEventSetup
Extend alternative module type loading to EventSetup
- Loading branch information
Showing
14 changed files
with
364 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
#ifndef FWCore_Framework_interface_resolveMaker_h | ||
#define FWCore_Framework_interface_resolveMaker_h | ||
|
||
#include "FWCore/Framework/interface/ModuleTypeResolverBase.h" | ||
#include "FWCore/Utilities/interface/Exception.h" | ||
|
||
#include <memory> | ||
#include <string> | ||
|
||
namespace edm::detail { | ||
void annotateResolverMakerExceptionAndRethrow(cms::Exception& except, | ||
std::string const& modtype, | ||
ModuleTypeResolverBase const* resolver); | ||
|
||
template <typename TFactory> | ||
auto resolveMaker(std::string const& moduleType, ModuleTypeResolverBase const* resolver) { | ||
if (resolver) { | ||
auto index = resolver->kInitialIndex; | ||
auto newType = moduleType; | ||
do { | ||
auto [ttype, tindex] = resolver->resolveType(std::move(newType), index); | ||
newType = std::move(ttype); | ||
index = tindex; | ||
auto m = TFactory::get()->tryToCreate(newType); | ||
if (m) { | ||
return m; | ||
} | ||
} while (index != resolver->kLastIndex); | ||
try { | ||
//failed to find a plugin | ||
return TFactory::get()->create(moduleType); | ||
} catch (cms::Exception& iExcept) { | ||
detail::annotateResolverMakerExceptionAndRethrow(iExcept, moduleType, resolver); | ||
} | ||
} | ||
return TFactory::get()->create(moduleType); | ||
} | ||
} // namespace edm::detail | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#include "FWCore/Framework/interface/resolveMaker.h" | ||
|
||
namespace edm::detail { | ||
void annotateResolverMakerExceptionAndRethrow(cms::Exception& except, | ||
std::string const& modtype, | ||
ModuleTypeResolverBase const* resolver) { | ||
if (not resolver) { | ||
throw except; | ||
} | ||
//if needed, create list of alternative types that were tried | ||
std::string alternativeTypes; | ||
auto index = resolver->kInitialIndex; | ||
auto newType = modtype; | ||
int tries = 0; | ||
do { | ||
++tries; | ||
if (not alternativeTypes.empty()) { | ||
alternativeTypes.append(", "); | ||
} | ||
auto [ttype, tindex] = resolver->resolveType(std::move(newType), index); | ||
newType = std::move(ttype); | ||
index = tindex; | ||
alternativeTypes.append(newType); | ||
} while (index != resolver->kLastIndex); | ||
if (tries == 1 and alternativeTypes == modtype) { | ||
throw except; | ||
} | ||
alternativeTypes.insert(0, "These alternative types were tried: "); | ||
except.addAdditionalInfo(alternativeTypes); | ||
throw except; | ||
} | ||
} // namespace edm::detail |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#ifndef FWCore_Framework_test_TestTypeResolvers_h | ||
#define FWCore_Framework_test_TestTypeResolvers_h | ||
|
||
#include "FWCore/Framework/interface/ModuleTypeResolverBase.h" | ||
|
||
#include <string> | ||
#include <utility> | ||
|
||
namespace edm::test { | ||
class SimpleTestTypeResolver : public edm::ModuleTypeResolverBase { | ||
public: | ||
SimpleTestTypeResolver() = default; | ||
std::pair<std::string, int> resolveType(std::string basename, int index) const final { | ||
return {basename, kLastIndex}; | ||
} | ||
}; | ||
|
||
class ComplexTestTypeResolver : public edm::ModuleTypeResolverBase { | ||
public: | ||
ComplexTestTypeResolver() = default; | ||
std::pair<std::string, int> resolveType(std::string basename, int index) const final { | ||
constexpr auto kGeneric = "generic::"; | ||
constexpr auto kOther = "edm::test::other::"; | ||
constexpr auto kCPU = "edm::test::cpu::"; | ||
if (index != kInitialIndex and index != kLastIndex) { | ||
basename.replace(basename.find(kOther), strlen(kOther), kCPU); | ||
return {basename, kLastIndex}; | ||
} | ||
if (index == kInitialIndex and basename.find(kGeneric) != std::string::npos) { | ||
basename.replace(basename.find(kGeneric), strlen(kGeneric), kOther); | ||
return {basename, kInitialIndex + 1}; | ||
} | ||
return {basename, kLastIndex}; | ||
} | ||
}; | ||
} // namespace edm::test | ||
|
||
#endif |
Oops, something went wrong.