MakeCapFloor::operator shared_ptr<CapFloor>() const { VanillaSwap swap = makeVanillaSwap_; Leg leg = swap.floatingLeg(); if (firstCapletExcluded_) leg.erase(leg.begin()); // only leaves the last coupon if (asOptionlet_ && leg.size() > 1) { Leg::iterator end = leg.end(); // Sun Studio needs an lvalue leg.erase(leg.begin(), --end); } std::vector<Rate> strikeVector(1, strike_); if (strike_ == Null<Rate>()) { // temporary patch... // should be fixed for every CapFloor::Engine shared_ptr<BlackCapFloorEngine> temp = dynamic_pointer_cast<BlackCapFloorEngine>(engine_); QL_REQUIRE(temp, "cannot calculate ATM without a BlackCapFloorEngine"); Handle<YieldTermStructure> discountCurve = temp->termStructure(); strikeVector[0] = CashFlows::atmRate(leg, **discountCurve, false, discountCurve->referenceDate()); } shared_ptr<CapFloor> capFloor(new CapFloor(capFloorType_, leg, strikeVector)); capFloor->setPricingEngine(engine_); return capFloor; }
NonstandardSwap::NonstandardSwap(const VanillaSwap &fromVanilla) : Swap(2), type_((VanillaSwap::Type)fromVanilla.type()), fixedNominal_(std::vector<Real>(fromVanilla.fixedLeg().size(), fromVanilla.nominal())), floatingNominal_(std::vector<Real>(fromVanilla.floatingLeg().size(), fromVanilla.nominal())), fixedSchedule_(fromVanilla.fixedSchedule()), fixedRate_(std::vector<Real>(fromVanilla.fixedLeg().size(), fromVanilla.fixedRate())), fixedDayCount_(fromVanilla.fixedDayCount()), floatingSchedule_(fromVanilla.floatingSchedule()), iborIndex_(fromVanilla.iborIndex()), spread_(std::vector<Real>(fromVanilla.floatingLeg().size(), fromVanilla.spread())), gearing_(std::vector<Real>(fromVanilla.floatingLeg().size(), 1.0)), singleSpreadAndGearing_(true), floatingDayCount_(fromVanilla.floatingDayCount()), paymentConvention_(fromVanilla.paymentConvention()), intermediateCapitalExchange_(false), finalCapitalExchange_(false) { init(); }