/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.generic;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositIbor;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolationGearing;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthlyGearing;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedCompounding;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIbor;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon;
/**
* Calculator of the last fixing start time.
* For fixed coupon, it is 0.
*/
public final class LastFixingStartTimeCalculator extends InstrumentDerivativeVisitorAdapter<Object, Double> {
/**
* The unique instance of the calculator.
*/
private static final LastFixingStartTimeCalculator INSTANCE = new LastFixingStartTimeCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static LastFixingStartTimeCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private LastFixingStartTimeCalculator() {
}
// ----- Deposit ------
// @Override
// public Double visitCash(final Cash cash) {
// return cash.getEndTime();
// }
@Override
public Double visitDepositIbor(final DepositIbor deposit) {
return deposit.getStartTime();
}
// ----- Payment/Coupon ------
@Override
public Double visitCouponFixed(final CouponFixed payment) {
return 0.0;
}
@Override
public Double visitCouponFixedCompounding(final CouponFixedCompounding payment) {
return 0.0;
}
@Override
public Double visitCouponIbor(final CouponIbor payment) {
return payment.getFixingPeriodStartTime();
}
// @Override
// public Double visitCouponOIS(final CouponOIS payment) {
// return payment.getFixingPeriodEndTime();
// }
// ----- Annuity ------
@Override
public Double visitGenericAnnuity(final Annuity<? extends Payment> annuity) {
double result = 0.0;
for (int loopp = 0; loopp < annuity.getNumberOfPayments(); loopp++) {
result = Math.max(result, annuity.getNthPayment(loopp).accept(this));
}
return result;
}
@Override
public Double visitFixedCouponAnnuity(final AnnuityCouponFixed annuity) {
return visitGenericAnnuity(annuity);
}
// ----- Swap ------
@Override
public Double visitSwap(final Swap<?, ?> swap) {
final double a = swap.getFirstLeg().accept(this);
final double b = swap.getSecondLeg().accept(this);
return Math.max(a, b);
}
@Override
public Double visitFixedCouponSwap(final SwapFixedCoupon<?> swap) {
return visitSwap(swap);
}
// ----- Inflation -----
@Override
public Double visitCouponInflationZeroCouponMonthly(final CouponInflationZeroCouponMonthly coupon) {
return coupon.getReferenceEndTime();
}
@Override
public Double visitCouponInflationZeroCouponMonthlyGearing(final CouponInflationZeroCouponMonthlyGearing coupon) {
return coupon.getReferenceEndTime();
}
@Override
public Double visitCouponInflationZeroCouponInterpolation(final CouponInflationZeroCouponInterpolation coupon) {
return coupon.getReferenceEndTime()[0];
}
@Override
public Double visitCouponInflationZeroCouponInterpolationGearing(final CouponInflationZeroCouponInterpolationGearing coupon) {
return coupon.getReferenceEndTime()[0];
}
@Override
public Double visitCouponInflationYearOnYearMonthly(final CouponInflationYearOnYearMonthly coupon) {
return coupon.getReferenceEndTime();
}
@Override
public Double visitCouponInflationYearOnYearInterpolation(final CouponInflationYearOnYearInterpolation coupon) {
return coupon.getReferenceEndTime()[0];
}
}