Skip to content

Commit a823adf

Browse files
pcaspersjenkins
authored andcommitted
QPR-11568 align behaviour with other factories, remove workaround
1 parent 78571d9 commit a823adf

2 files changed

Lines changed: 47 additions & 10 deletions

File tree

OREData/ored/portfolio/enginefactory.cpp

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,56 @@ std::string EngineBuilder::modelParameter(const std::string& p, const std::vecto
6262
return getParameter(modelParameters_, p, qualifiers, mandatory, defaultValue);
6363
}
6464

65-
void EngineBuilderFactory::addEngineBuilder(const std::function<boost::shared_ptr<EngineBuilder>()>& builder) {
65+
void EngineBuilderFactory::addEngineBuilder(const std::function<boost::shared_ptr<EngineBuilder>()>& builder,
66+
const bool allowOverwrite) {
6667
boost::unique_lock<boost::shared_mutex> lock(mutex_);
68+
auto tmp = builder();
69+
auto key = make_tuple(tmp->model(), tmp->engine(), tmp->tradeTypes());
70+
auto it = std::remove_if(engineBuilderBuilders_.begin(), engineBuilderBuilders_.end(),
71+
[&key](std::function<boost::shared_ptr<EngineBuilder>()>& b) {
72+
auto tmp = b();
73+
return key == std::make_tuple(tmp->model(), tmp->engine(), tmp->tradeTypes());
74+
});
75+
QL_REQUIRE(it == engineBuilderBuilders_.end() || allowOverwrite,
76+
"EngineBuilderFactory::addEngineBuilder(" << tmp->model() << "/" << tmp->engine() << "/"
77+
<< boost::algorithm::join(tmp->tradeTypes(), ",")
78+
<< "): builder for given key already exists.");
79+
engineBuilderBuilders_.erase(it, engineBuilderBuilders_.end());
6780
engineBuilderBuilders_.push_back(builder);
6881
}
6982

7083
void EngineBuilderFactory::addAmcEngineBuilder(
7184
const std::function<boost::shared_ptr<EngineBuilder>(const boost::shared_ptr<QuantExt::CrossAssetModel>& cam,
72-
const std::vector<Date>& grid)>& builder) {
85+
const std::vector<Date>& grid)>& builder,
86+
const bool allowOverwrite) {
7387
boost::unique_lock<boost::shared_mutex> lock(mutex_);
88+
auto tmp = builder(nullptr, {});
89+
auto key = make_tuple(tmp->model(), tmp->engine(), tmp->tradeTypes());
90+
auto it = std::remove_if(
91+
amcEngineBuilderBuilders_.begin(), amcEngineBuilderBuilders_.end(),
92+
[&key](std::function<boost::shared_ptr<EngineBuilder>(const boost::shared_ptr<QuantExt::CrossAssetModel>& cam,
93+
const std::vector<Date>& grid)>& b) {
94+
auto tmp = b(nullptr, {});
95+
return key == std::make_tuple(tmp->model(), tmp->engine(), tmp->tradeTypes());
96+
});
97+
QL_REQUIRE(it == amcEngineBuilderBuilders_.end() || allowOverwrite,
98+
"EngineBuilderFactory::addAmcEngineBuilder(" << tmp->model() << "/" << tmp->engine() << "/"
99+
<< boost::algorithm::join(tmp->tradeTypes(), ",")
100+
<< "): builder for given key already exists.");
101+
amcEngineBuilderBuilders_.erase(it, amcEngineBuilderBuilders_.end());
74102
amcEngineBuilderBuilders_.push_back(builder);
75103
}
76104

77-
void EngineBuilderFactory::addLegBuilder(const std::function<boost::shared_ptr<LegBuilder>()>& builder) {
105+
void EngineBuilderFactory::addLegBuilder(const std::function<boost::shared_ptr<LegBuilder>()>& builder,
106+
const bool allowOverwrite) {
78107
boost::unique_lock<boost::shared_mutex> lock(mutex_);
108+
auto key = builder()->legType();
109+
auto it =
110+
std::remove_if(legBuilderBuilders_.begin(), legBuilderBuilders_.end(),
111+
[&key](std::function<boost::shared_ptr<LegBuilder>()>& b) { return key == b()->legType(); });
112+
QL_REQUIRE(it == legBuilderBuilders_.end() || allowOverwrite,
113+
"EngineBuilderFactory::addLegBuilder(" << key << "): builder for given key already exists.");
114+
legBuilderBuilders_.erase(it, legBuilderBuilders_.end());
79115
legBuilderBuilders_.push_back(builder);
80116
}
81117

@@ -123,8 +159,7 @@ void EngineFactory::registerBuilder(const boost::shared_ptr<EngineBuilder>& buil
123159
const string& modelName = builder->model();
124160
const string& engineName = builder->engine();
125161
auto key = make_tuple(modelName, engineName, builder->tradeTypes());
126-
// FIXME workaround to allow manual registration of builders on windows, remove once this is resolved
127-
if(true || allowOverwrite)
162+
if (allowOverwrite)
128163
builders_.erase(key);
129164
QL_REQUIRE(builders_.insert(make_pair(key, builder)).second,
130165
"EngineFactory: duplicate engine builder for (" << modelName << "/" << engineName << "/"
@@ -161,8 +196,7 @@ boost::shared_ptr<EngineBuilder> EngineFactory::builder(const string& tradeType)
161196
}
162197

163198
void EngineFactory::registerLegBuilder(const boost::shared_ptr<LegBuilder>& legBuilder, const bool allowOverwrite) {
164-
// FIXME workaround to allow manual registration of builders on windows, remove once this is resolved
165-
if(true || allowOverwrite)
199+
if (allowOverwrite)
166200
legBuilders_.erase(legBuilder->legType());
167201
QL_REQUIRE(legBuilders_.insert(make_pair(legBuilder->legType(), legBuilder)).second,
168202
"EngineFactory duplicate leg builder for '" << legBuilder->legType()

OREData/ored/portfolio/enginefactory.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,14 @@ class EngineBuilderFactory : public QuantLib::Singleton<EngineBuilderFactory, st
185185
mutable boost::shared_mutex mutex_;
186186

187187
public:
188-
void addEngineBuilder(const std::function<boost::shared_ptr<EngineBuilder>()>& builder);
188+
void addEngineBuilder(const std::function<boost::shared_ptr<EngineBuilder>()>& builder,
189+
const bool allowOverwrite = false);
189190
void addAmcEngineBuilder(
190191
const std::function<boost::shared_ptr<EngineBuilder>(const boost::shared_ptr<QuantExt::CrossAssetModel>& cam,
191-
const std::vector<Date>& grid)>& builder);
192-
void addLegBuilder(const std::function<boost::shared_ptr<LegBuilder>()>& builder);
192+
const std::vector<Date>& grid)>& builder,
193+
const bool allowOverwrite = false);
194+
void addLegBuilder(const std::function<boost::shared_ptr<LegBuilder>()>& builder,
195+
const bool allowOverwrite = false);
193196

194197
std::vector<boost::shared_ptr<EngineBuilder>> generateEngineBuilders() const;
195198
std::vector<boost::shared_ptr<EngineBuilder>>

0 commit comments

Comments
 (0)