@@ -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
7083void 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
163198void 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 ()
0 commit comments