1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 /*
4  Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
5  Copyright (C) 2003, 2004, 2007 StatPro Italia srl
6 
7  This file is part of QuantLib, a free-software/open-source library
8  for financial quantitative analysts and developers - http://quantlib.org/
9 
10  QuantLib is free software: you can redistribute it and/or modify it
11  under the terms of the QuantLib license.  You should have received a
12  copy of the license along with this program; if not, please email
13  <quantlib-dev@lists.sf.net>. The license is also available online at
14  <http://quantlib.org/license.shtml>.
15 
16  This program is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18  FOR A PARTICULAR PURPOSE.  See the license for more details.
19 */
20 
21 /*! \file coupon.hpp
22     \brief Coupon accruing over a fixed period
23 */
24 
25 #ifndef quantlib_coupon_hpp
26 #define quantlib_coupon_hpp
27 
28 #include <ql/cashflow.hpp>
29 
30 namespace QuantLib {
31 
32     class DayCounter;
33 
34     //! %coupon accruing over a fixed period
35     /*! This class implements part of the CashFlow interface but it is
36         still abstract and provides derived classes with methods for
37         accrual period calculations.
38     */
39     class Coupon : public CashFlow {
40       public:
41         /*! \warning the coupon does not adjust the payment date which
42                      must already be a business day.
43         */
44         Coupon(const Date& paymentDate,
45                Real nominal,
46                const Date& accrualStartDate,
47                const Date& accrualEndDate,
48                const Date& refPeriodStart = Date(),
49                const Date& refPeriodEnd = Date(),
50                const Date& exCouponDate = Date());
51         //! \name Event interface
52         //@{
date() const53         Date date() const { return paymentDate_; }
54         //@}
55         //! \name CashFlow interface
56         //@{
exCouponDate() const57         Date exCouponDate() const { return exCouponDate_; }
58         //@}
59         //! \name Inspectors
60         //@{
61         virtual Real nominal() const;
62         //! start of the accrual period
63         const Date& accrualStartDate() const;
64         //! end of the accrual period
65         const Date& accrualEndDate() const;
66         //! start date of the reference period
67         const Date& referencePeriodStart() const;
68         //! end date of the reference period
69         const Date& referencePeriodEnd() const;
70         //! accrual period as fraction of year
71         Time accrualPeriod() const;
72         //! accrual period in days
73         Date::serial_type accrualDays() const;
74         //! accrued rate
75         virtual Rate rate() const = 0;
76         //! day counter for accrual calculation
77         virtual DayCounter dayCounter() const = 0;
78         //! accrued period as fraction of year at the given date
79         Time accruedPeriod(const Date&) const;
80         //! accrued days at the given date
81         Date::serial_type accruedDays(const Date&) const;
82         //! accrued amount at the given date
83         virtual Real accruedAmount(const Date&) const = 0;
84         //@}
85         //! \name Visitability
86         //@{
87         virtual void accept(AcyclicVisitor&);
88         //@}
89       protected:
90         Date paymentDate_;
91         Real nominal_;
92         Date accrualStartDate_,accrualEndDate_, refPeriodStart_,refPeriodEnd_;
93         Date exCouponDate_;
94         mutable Real accrualPeriod_;
95     };
96 
97 
98     // inline definitions
99 
nominal() const100     inline Real Coupon::nominal() const {
101         return nominal_;
102     }
103 
accrualStartDate() const104     inline const Date& Coupon::accrualStartDate() const {
105         return accrualStartDate_;
106     }
107 
accrualEndDate() const108     inline const Date& Coupon::accrualEndDate() const {
109         return accrualEndDate_;
110     }
111 
referencePeriodStart() const112     inline const Date& Coupon::referencePeriodStart() const {
113         return refPeriodStart_;
114     }
115 
referencePeriodEnd() const116     inline const Date& Coupon::referencePeriodEnd() const {
117         return refPeriodEnd_;
118     }
119 
120 }
121 
122 #endif
123