1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3/*
4 Copyright (C) 2007, 2011 Ferdinando Ametrano
5 Copyright (C) 2007 François du Vignaud
6 Copyright (C) 2004, 2005, 2007, 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 settings.hpp
23 \brief global repository for run-time library settings
24*/
25
26#ifndef quantlib_settings_hpp
27#define quantlib_settings_hpp
28
29#include <ql/patterns/singleton.hpp>
30#include <ql/time/date.hpp>
31#include <ql/utilities/observablevalue.hpp>
32#include <ql/optional.hpp>
33
34namespace QuantLib {
35
36 //! global repository for run-time library settings
37 class Settings : public Singleton<Settings> {
38 friend class Singleton<Settings>;
39 private:
40 Settings();
41 class DateProxy : public ObservableValue<Date> {
42 public:
43 DateProxy();
44 DateProxy& operator=(const Date&);
45 operator Date() const;
46 };
47 friend std::ostream& operator<<(std::ostream&, const DateProxy&);
48 public:
49 //! the date at which pricing is to be performed.
50 /*! Client code can inspect the evaluation date, as in:
51 \code
52 Date d = Settings::instance().evaluationDate();
53 \endcode
54 where today's date is returned if the evaluation date is
55 set to the null date (its default value;) can set it to a
56 new value, as in:
57 \code
58 Settings::instance().evaluationDate() = d;
59 \endcode
60 and can register with it, as in:
61 \code
62 registerWith(Settings::instance().evaluationDate());
63 \endcode
64 to be notified when it is set to a new value.
65 \warning a notification is not sent when the evaluation
66 date changes for natural causes---i.e., a date
67 was not explicitly set (which results in today's
68 date being used for pricing) and the current date
69 changes as the clock strikes midnight.
70 */
71 DateProxy& evaluationDate();
72 const DateProxy& evaluationDate() const;
73
74 /*! Call this to prevent the evaluation date to change at
75 midnight (and, incidentally, to gain quite a bit of
76 performance.) If no evaluation date was previously set,
77 it is equivalent to setting the evaluation date to
78 Date::todaysDate(); if an evaluation date other than
79 Date() was already set, it has no effect.
80 */
81 void anchorEvaluationDate();
82 /*! Call this to reset the evaluation date to
83 Date::todaysDate() and allow it to change at midnight. It
84 is equivalent to setting the evaluation date to Date().
85 This comes at the price of losing some performance, since
86 the evaluation date is re-evaluated each time it is read.
87 */
88 void resetEvaluationDate();
89
90 /*! This flag specifies whether or not Events occurring on the reference
91 date should, by default, be taken into account as not happened yet.
92 It can be overridden locally when calling the Event::hasOccurred
93 method.
94 */
95 bool& includeReferenceDateEvents();
96 bool includeReferenceDateEvents() const;
97
98 /*! If set, this flag specifies whether or not CashFlows
99 occurring on today's date should enter the NPV. When the
100 NPV date (i.e., the date at which the cash flows are
101 discounted) equals today's date, this flag overrides the
102 behavior chosen for includeReferenceDate. It cannot be overridden
103 locally when calling the CashFlow::hasOccurred method.
104 */
105 ext::optional<bool>& includeTodaysCashFlows();
106 ext::optional<bool> includeTodaysCashFlows() const;
107
108 bool& enforcesTodaysHistoricFixings();
109 bool enforcesTodaysHistoricFixings() const;
110
111 private:
112 DateProxy evaluationDate_;
113 bool includeReferenceDateEvents_ = false;
114 ext::optional<bool> includeTodaysCashFlows_;
115 bool enforcesTodaysHistoricFixings_ = false;
116 };
117
118
119 // helper class to temporarily and safely change the settings
120 class SavedSettings { // NOLINT(cppcoreguidelines-special-member-functions)
121 public:
122 SavedSettings();
123 ~SavedSettings();
124 private:
125 Date evaluationDate_;
126 bool includeReferenceDateEvents_;
127 ext::optional<bool> includeTodaysCashFlows_;
128 bool enforcesTodaysHistoricFixings_;
129 };
130
131
132 // inline
133
134 inline Settings::DateProxy::operator Date() const {
135 if (value() == Date())
136 return Date::todaysDate();
137 else
138 return value();
139 }
140
141 inline Settings::DateProxy& Settings::DateProxy::operator=(const Date& d) {
142 if (value() != d) // avoid notifications if the date doesn't actually change
143 ObservableValue<Date>::operator=(t: d);
144 return *this;
145 }
146
147 inline Settings::DateProxy& Settings::evaluationDate() {
148 return evaluationDate_;
149 }
150
151 inline const Settings::DateProxy& Settings::evaluationDate() const {
152 return evaluationDate_;
153 }
154
155 inline bool& Settings::includeReferenceDateEvents() {
156 return includeReferenceDateEvents_;
157 }
158
159 inline bool Settings::includeReferenceDateEvents() const {
160 return includeReferenceDateEvents_;
161 }
162
163 inline ext::optional<bool>& Settings::includeTodaysCashFlows() {
164 return includeTodaysCashFlows_;
165 }
166
167 inline ext::optional<bool> Settings::includeTodaysCashFlows() const {
168 return includeTodaysCashFlows_;
169 }
170
171 inline bool& Settings::enforcesTodaysHistoricFixings() {
172 return enforcesTodaysHistoricFixings_;
173 }
174
175 inline bool Settings::enforcesTodaysHistoricFixings() const {
176 return enforcesTodaysHistoricFixings_;
177 }
178
179}
180
181#endif
182

source code of quantlib/ql/settings.hpp