Coverage Report

Created: 2025-08-28 06:30

/src/quantlib/ql/time/schedule.hpp
Line
Count
Source (jump to first uncovered line)
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
36
namespace 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
88.1k
        Schedule() = default;
67
        //! \name Element access
68
        //@{
69
31.9M
        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
0
        const std::vector<Date>& dates() const { return dates_; }
74
88.1k
        bool empty() const { return dates_.empty(); }
75
        const Date& front() const;
76
        const Date& back() const;
77
        //@}
78
        //! \name Other inspectors
79
        //@{
80
        Date previousDate(const Date& refDate) const;
81
        Date nextDate(const Date& refDate) const;
82
        bool hasIsRegular() const;
83
        bool isRegular(Size i) const;
84
        const std::vector<bool>& isRegular() const;
85
        const Calendar& calendar() const;
86
        const Date& startDate() const;
87
        const Date& endDate() const;
88
        bool hasTenor() const;
89
        const Period& tenor() const;
90
        BusinessDayConvention businessDayConvention() const;
91
        bool hasTerminationDateBusinessDayConvention() const;
92
        BusinessDayConvention terminationDateBusinessDayConvention() const;
93
        bool hasRule() const;
94
        DateGeneration::Rule rule() const;
95
        bool hasEndOfMonth() const;
96
        bool endOfMonth() const;
97
        //@}
98
        //! \name Iterators
99
        //@{
100
        typedef std::vector<Date>::const_iterator const_iterator;
101
0
        const_iterator begin() const { return dates_.begin(); }
102
0
        const_iterator end() const { return dates_.end(); }
103
        const_iterator lower_bound(const Date& d = Date()) const;
104
        //@}
105
        //! \name Utilities
106
        //@{
107
        //! truncated schedule
108
        Schedule after(const Date& truncationDate) const;
109
        Schedule until(const Date& truncationDate) const;
110
        //@}
111
      private:
112
        ext::optional<Period> tenor_;
113
        Calendar calendar_;
114
        BusinessDayConvention convention_;
115
        ext::optional<BusinessDayConvention> terminationDateConvention_;
116
        ext::optional<DateGeneration::Rule> rule_;
117
        ext::optional<bool> endOfMonth_;
118
        Date firstDate_, nextToLastDate_;
119
        std::vector<Date> dates_;
120
        std::vector<bool> isRegular_;
121
    };
122
123
124
    //! helper class
125
    /*! This class provides a more comfortable interface to the
126
        argument list of Schedule's constructor.
127
    */
128
    class MakeSchedule {
129
      public:
130
        MakeSchedule& from(const Date& effectiveDate);
131
        MakeSchedule& to(const Date& terminationDate);
132
        MakeSchedule& withTenor(const Period&);
133
        MakeSchedule& withFrequency(Frequency);
134
        MakeSchedule& withCalendar(const Calendar&);
135
        MakeSchedule& withConvention(BusinessDayConvention);
136
        MakeSchedule& withTerminationDateConvention(BusinessDayConvention);
137
        MakeSchedule& withRule(DateGeneration::Rule);
138
        MakeSchedule& forwards();
139
        MakeSchedule& backwards();
140
        MakeSchedule& endOfMonth(bool flag=true);
141
        MakeSchedule& withFirstDate(const Date& d);
142
        MakeSchedule& withNextToLastDate(const Date& d);
143
        operator Schedule() const;
144
      private:
145
        Calendar calendar_;
146
        Date effectiveDate_, terminationDate_;
147
        ext::optional<Period> tenor_;
148
        ext::optional<BusinessDayConvention> convention_;
149
        ext::optional<BusinessDayConvention> terminationDateConvention_;
150
        DateGeneration::Rule rule_ = DateGeneration::Backward;
151
        bool endOfMonth_ = false;
152
        Date firstDate_, nextToLastDate_;
153
    };
154
155
    /*! Helper function for returning the date on or before date \p d that is the 20th of the month and obeserves the 
156
        given date generation \p rule if it is relevant.
157
    */
158
    Date previousTwentieth(const Date& d, DateGeneration::Rule rule);
159
160
    // inline definitions
161
162
31.8M
    inline const Date& Schedule::date(Size i) const {
163
31.8M
        return dates_.at(i);
164
31.8M
    }
165
166
0
    inline const Date& Schedule::operator[](Size i) const {
167
0
        #if defined(QL_EXTRA_SAFETY_CHECKS)
168
0
        return dates_.at(i);
169
0
        #else
170
0
        return dates_[i];
171
0
        #endif
172
0
    }
173
174
0
    inline const Date& Schedule::at(Size i) const {
175
0
        return dates_.at(i);
176
0
    }
177
178
0
    inline const Date& Schedule::front() const {
179
0
        QL_REQUIRE(!dates_.empty(), "no front date for empty schedule");
180
0
        return dates_.front();
181
0
    }
Unexecuted instantiation: QuantLib::Schedule::front() const
Unexecuted instantiation: QuantLib::Schedule::front() const
182
183
0
    inline const Date& Schedule::back() const {
184
0
        QL_REQUIRE(!dates_.empty(), "no back date for empty schedule");
185
0
        return dates_.back();
186
0
    }
Unexecuted instantiation: QuantLib::Schedule::back() const
Unexecuted instantiation: QuantLib::Schedule::back() const
187
188
176k
    inline const Calendar& Schedule::calendar() const {
189
176k
        return calendar_;
190
176k
    }
191
192
0
    inline const Date& Schedule::startDate() const {
193
0
        return dates_.front();
194
0
    }
195
196
88.1k
    inline const Date &Schedule::endDate() const { return dates_.back(); }
197
198
176k
    inline bool Schedule::hasTenor() const {
199
176k
        return static_cast<bool>(tenor_);
200
176k
    }
201
202
88.1k
    inline const Period& Schedule::tenor() const {
203
88.1k
        QL_REQUIRE(hasTenor(),
204
88.1k
                   "full interface (tenor) not available");
205
88.1k
        return *tenor_;  // NOLINT(bugprone-unchecked-optional-access)
206
88.1k
    }
207
208
0
    inline BusinessDayConvention Schedule::businessDayConvention() const {
209
0
        return convention_;
210
0
    }
211
212
    inline bool
213
0
    Schedule::hasTerminationDateBusinessDayConvention() const {
214
0
        return static_cast<bool>(terminationDateConvention_);
215
0
    }
216
217
    inline BusinessDayConvention
218
0
    Schedule::terminationDateBusinessDayConvention() const {
219
0
        QL_REQUIRE(hasTerminationDateBusinessDayConvention(),
220
0
                   "full interface (termination date bdc) not available");
221
0
        return *terminationDateConvention_;  // NOLINT(bugprone-unchecked-optional-access)
222
0
    }
223
224
0
    inline bool Schedule::hasRule() const {
225
0
        return static_cast<bool>(rule_);
226
0
    }
227
228
0
    inline DateGeneration::Rule Schedule::rule() const {
229
0
        QL_REQUIRE(hasRule(), "full interface (rule) not available");
230
0
        return *rule_;  // NOLINT(bugprone-unchecked-optional-access)
231
0
    }
Unexecuted instantiation: QuantLib::Schedule::rule() const
Unexecuted instantiation: QuantLib::Schedule::rule() const
232
233
0
    inline bool Schedule::hasEndOfMonth() const {
234
0
        return static_cast<bool>(endOfMonth_);
235
0
    }
236
237
0
    inline bool Schedule::endOfMonth() const {
238
0
        QL_REQUIRE(hasEndOfMonth(),
239
0
                   "full interface (end of month) not available");
240
0
        return *endOfMonth_;  // NOLINT(bugprone-unchecked-optional-access)
241
0
    }
Unexecuted instantiation: QuantLib::Schedule::endOfMonth() const
Unexecuted instantiation: QuantLib::Schedule::endOfMonth() const
242
243
}
244
245
#endif