1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3/*
4 Copyright (C) 2006, 2007, 2011 Ferdinando Ametrano
5 Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
6 Copyright (C) 2003, 2004, 2005, 2006, 2009 StatPro Italia srl
7
8 This file is part of QuantLib, a free-software/open-source library
9 for financial quantitative analysts and developers - http://quantlib.org/
10
11 QuantLib is free software: you can redistribute it and/or modify it
12 under the terms of the QuantLib license. You should have received a
13 copy of the license along with this program; if not, please email
14 <quantlib-dev@lists.sf.net>. The license is also available online at
15 <http://quantlib.org/license.shtml>.
16
17 This program is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 FOR A PARTICULAR PURPOSE. See the license for more details.
20*/
21
22/*! \file schedule.hpp
23 \brief date schedule
24*/
25
26#ifndef quantlib_schedule_hpp
27#define quantlib_schedule_hpp
28
29#include <ql/time/calendars/nullcalendar.hpp>
30#include <ql/utilities/null.hpp>
31#include <ql/time/period.hpp>
32#include <ql/time/dategenerationrule.hpp>
33#include <ql/errors.hpp>
34#include <ql/optional.hpp>
35
36namespace QuantLib {
37
38 //! Payment schedule
39 /*! \ingroup datetime */
40 class Schedule {
41 public:
42 /*! constructor that takes any list of dates, and optionally
43 meta information that can be used by client classes. Note
44 that neither the list of dates nor the meta information is
45 checked for plausibility in any sense. */
46 Schedule(
47 const std::vector<Date>&,
48 Calendar calendar = NullCalendar(),
49 BusinessDayConvention convention = Unadjusted,
50 const ext::optional<BusinessDayConvention>& terminationDateConvention = ext::nullopt,
51 const ext::optional<Period>& tenor = ext::nullopt,
52 const ext::optional<DateGeneration::Rule>& rule = ext::nullopt,
53 const ext::optional<bool>& endOfMonth = ext::nullopt,
54 std::vector<bool> isRegular = std::vector<bool>(0));
55 /*! rule based constructor */
56 Schedule(Date effectiveDate,
57 const Date& terminationDate,
58 const Period& tenor,
59 Calendar calendar,
60 BusinessDayConvention convention,
61 BusinessDayConvention terminationDateConvention,
62 DateGeneration::Rule rule,
63 bool endOfMonth,
64 const Date& firstDate = Date(),
65 const Date& nextToLastDate = Date());
66 Schedule() = default;
67 //! \name Date access
68 //@{
69 Size size() const { return dates_.size(); }
70 const Date& operator[](Size i) const;
71 const Date& at(Size i) const;
72 const Date& date(Size i) const;
73 Date previousDate(const Date& refDate) const;
74 Date nextDate(const Date& refDate) const;
75 const std::vector<Date>& dates() const { return dates_; }
76 bool hasIsRegular() const;
77 bool isRegular(Size i) const;
78 const std::vector<bool>& isRegular() const;
79 //@}
80 //! \name Other inspectors
81 //@{
82 bool empty() const { return dates_.empty(); }
83 const Calendar& calendar() const;
84 const Date& startDate() const;
85 const Date& endDate() const;
86 bool hasTenor() const;
87 const Period& tenor() const;
88 BusinessDayConvention businessDayConvention() const;
89 bool hasTerminationDateBusinessDayConvention() const;
90 BusinessDayConvention terminationDateBusinessDayConvention() const;
91 bool hasRule() const;
92 DateGeneration::Rule rule() const;
93 bool hasEndOfMonth() const;
94 bool endOfMonth() const;
95 //@}
96 //! \name Iterators
97 //@{
98 typedef std::vector<Date>::const_iterator const_iterator;
99 const_iterator begin() const { return dates_.begin(); }
100 const_iterator end() const { return dates_.end(); }
101 const_iterator lower_bound(const Date& d = Date()) const;
102 //@}
103 //! \name Utilities
104 //@{
105 //! truncated schedule
106 Schedule after(const Date& truncationDate) const;
107 Schedule until(const Date& truncationDate) const;
108 //@}
109 private:
110 ext::optional<Period> tenor_;
111 Calendar calendar_;
112 BusinessDayConvention convention_;
113 ext::optional<BusinessDayConvention> terminationDateConvention_;
114 ext::optional<DateGeneration::Rule> rule_;
115 ext::optional<bool> endOfMonth_;
116 Date firstDate_, nextToLastDate_;
117 std::vector<Date> dates_;
118 std::vector<bool> isRegular_;
119 };
120
121
122 //! helper class
123 /*! This class provides a more comfortable interface to the
124 argument list of Schedule's constructor.
125 */
126 class MakeSchedule {
127 public:
128 MakeSchedule& from(const Date& effectiveDate);
129 MakeSchedule& to(const Date& terminationDate);
130 MakeSchedule& withTenor(const Period&);
131 MakeSchedule& withFrequency(Frequency);
132 MakeSchedule& withCalendar(const Calendar&);
133 MakeSchedule& withConvention(BusinessDayConvention);
134 MakeSchedule& withTerminationDateConvention(BusinessDayConvention);
135 MakeSchedule& withRule(DateGeneration::Rule);
136 MakeSchedule& forwards();
137 MakeSchedule& backwards();
138 MakeSchedule& endOfMonth(bool flag=true);
139 MakeSchedule& withFirstDate(const Date& d);
140 MakeSchedule& withNextToLastDate(const Date& d);
141 operator Schedule() const;
142 private:
143 Calendar calendar_;
144 Date effectiveDate_, terminationDate_;
145 ext::optional<Period> tenor_;
146 ext::optional<BusinessDayConvention> convention_;
147 ext::optional<BusinessDayConvention> terminationDateConvention_;
148 DateGeneration::Rule rule_ = DateGeneration::Backward;
149 bool endOfMonth_ = false;
150 Date firstDate_, nextToLastDate_;
151 };
152
153 /*! Helper function for returning the date on or before date \p d that is the 20th of the month and obeserves the
154 given date generation \p rule if it is relevant.
155 */
156 Date previousTwentieth(const Date& d, DateGeneration::Rule rule);
157
158 // inline definitions
159
160 inline const Date& Schedule::date(Size i) const {
161 return dates_.at(n: i);
162 }
163
164 inline const Date& Schedule::operator[](Size i) const {
165 #if defined(QL_EXTRA_SAFETY_CHECKS)
166 return dates_.at(i);
167 #else
168 return dates_[i];
169 #endif
170 }
171
172 inline const Date& Schedule::at(Size i) const {
173 return dates_.at(n: i);
174 }
175
176 inline const Calendar& Schedule::calendar() const {
177 return calendar_;
178 }
179
180 inline const Date& Schedule::startDate() const {
181 return dates_.front();
182 }
183
184 inline const Date &Schedule::endDate() const { return dates_.back(); }
185
186 inline bool Schedule::hasTenor() const {
187 return static_cast<bool>(tenor_);
188 }
189
190 inline const Period& Schedule::tenor() const {
191 QL_REQUIRE(hasTenor(),
192 "full interface (tenor) not available");
193 return *tenor_;
194 }
195
196 inline BusinessDayConvention Schedule::businessDayConvention() const {
197 return convention_;
198 }
199
200 inline bool
201 Schedule::hasTerminationDateBusinessDayConvention() const {
202 return static_cast<bool>(terminationDateConvention_);
203 }
204
205 inline BusinessDayConvention
206 Schedule::terminationDateBusinessDayConvention() const {
207 QL_REQUIRE(hasTerminationDateBusinessDayConvention(),
208 "full interface (termination date bdc) not available");
209 return *terminationDateConvention_;
210 }
211
212 inline bool Schedule::hasRule() const {
213 return static_cast<bool>(rule_);
214 }
215
216 inline DateGeneration::Rule Schedule::rule() const {
217 QL_REQUIRE(hasRule(), "full interface (rule) not available");
218 return *rule_;
219 }
220
221 inline bool Schedule::hasEndOfMonth() const {
222 return static_cast<bool>(endOfMonth_);
223 }
224
225 inline bool Schedule::endOfMonth() const {
226 QL_REQUIRE(hasEndOfMonth(),
227 "full interface (end of month) not available");
228 return *endOfMonth_;
229 }
230
231}
232
233#endif
234

source code of quantlib/ql/time/schedule.hpp