typename std::enable_if<std::is_base_of<fw::Strategy, S>::value, S&>::type install(Forwarder& forwarder, Args&&... args) { auto strategy = make_unique<S>(ref(forwarder), std::forward<Args>(args)...); fw::Strategy* installed = forwarder.getStrategyChoice().install(std::move(strategy)).second; return dynamic_cast<S&>(*installed); }
typename std::enable_if<std::is_base_of<fw::Strategy, S>::value, S&>::type choose(Forwarder& forwarder, const Name& prefix, Args&&... args) { S& strategy = install<S>(forwarder, std::forward<Args>(args)...); forwarder.getStrategyChoice().insert(prefix, strategy.getName()); return strategy; }
typename std::enable_if<std::is_base_of<fw::Strategy, S>::value, S&>::type choose(Forwarder& forwarder, const Name& prefix = "/", const Name& instanceName = S::getStrategyName()) { StrategyChoice& sc = forwarder.getStrategyChoice(); auto insertRes = sc.insert(prefix, instanceName); if (!insertRes) { BOOST_THROW_EXCEPTION(std::invalid_argument(boost::lexical_cast<std::string>(insertRes))); } return dynamic_cast<S&>(sc.findEffectiveStrategy(prefix)); }
MadmStrategy::MadmStrategy(Forwarder& forwarder, const Name& name) : Strategy(forwarder, name), ownStrategyChoice(forwarder.getStrategyChoice()) { }