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, 2005, 2006, 2007 StatPro Italia srl
6 Copyright (C) 2015 CompatibL
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 qldefines.hpp
23 \brief Global definitions and compiler switches.
24*/
25
26#ifndef quantlib_defines_hpp
27#define quantlib_defines_hpp
28
29#define QL_HAVE_CONFIG_H
30
31#ifdef _MSC_VER
32/* Microsoft-specific, but needs to be defined before
33 including <boost/config.hpp> which somehow includes
34 <math.h> under VC++10
35*/
36#define _USE_MATH_DEFINES
37#endif
38
39#include <boost/config.hpp>
40#include <boost/version.hpp>
41#if BOOST_VERSION < 104800
42 #error using an old version of Boost, please update.
43#endif
44#if !defined(BOOST_ENABLE_ASSERT_HANDLER)
45 #define BOOST_ENABLE_ASSERT_HANDLER
46#endif
47
48/* This allows one to include a given file at this point by
49 passing it as a compiler define (e.g., -DQL_INCLUDE_FIRST=foo.hpp).
50
51 The idea is to provide a hook for defining QL_REAL and at the
52 same time including any necessary headers for the new type.
53*/
54#define INCLUDE_FILE(F) INCLUDE_FILE_(F)
55#define INCLUDE_FILE_(F) #F
56#ifdef QL_INCLUDE_FIRST
57# include INCLUDE_FILE(QL_INCLUDE_FIRST)
58#endif
59#undef INCLUDE_FILE_
60#undef INCLUDE_FILE
61
62/* Eventually these might go into userconfig.hpp.
63 For the time being, we hard code them here.
64 They can be overridden by passing the #define to the compiler.
65*/
66#ifndef QL_INTEGER
67# define QL_INTEGER int
68#endif
69
70#ifndef QL_BIG_INTEGER
71# define QL_BIG_INTEGER long
72#endif
73
74#ifndef QL_REAL
75# define QL_REAL double
76#endif
77
78
79/*! \defgroup macros QuantLib macros
80
81 Global definitions and a few macros which help porting the
82 code to different compilers.
83
84 @{
85*/
86
87#if (defined(_DEBUG) || defined(DEBUG))
88 #define QL_DEBUG
89#endif
90
91#if defined(QL_HAVE_CONFIG_H) // Dynamically created by configure
92 #include <ql/config.hpp>
93/* Use BOOST_MSVC instead of _MSC_VER since some other vendors (Metrowerks,
94 for example) also #define _MSC_VER
95*/
96#elif defined(BOOST_MSVC) // Microsoft Visual C++
97 #include <ql/config.msvc.hpp>
98#elif defined(__MINGW32__) // Minimalistic GNU for Windows
99 #include <ql/config.mingw.hpp>
100#elif defined(__SUNPRO_CC) // Sun Studio
101 #include <ql/config.sun.hpp>
102#else // We hope that the compiler follows ANSI
103 #include <ql/config.ansi.hpp>
104#endif
105
106
107// extra debug checks
108#ifdef QL_DEBUG
109 #ifndef QL_EXTRA_SAFETY_CHECKS
110 #define QL_EXTRA_SAFETY_CHECKS
111 #endif
112#endif
113
114#ifdef QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN
115 #if BOOST_VERSION < 105800
116 #error Boost version 1.58 or higher is required for the thread-safe observer pattern
117 #endif
118#endif
119
120#ifdef QL_ENABLE_PARALLEL_UNIT_TEST_RUNNER
121 #if BOOST_VERSION < 105900
122 #error Boost version 1.59 or higher is required for the parallel unit test runner
123 #endif
124#endif
125
126// ensure that needed math constants are defined
127#include <ql/mathconstants.hpp>
128
129
130// import global functions into std namespace
131#if defined(BOOST_NO_STDC_NAMESPACE)
132 #include <cmath>
133 namespace std {
134 using ::sqrt; using ::abs; using ::fabs;
135 using ::exp; using ::log; using ::pow;
136 using ::sin; using ::cos; using ::asin; using ::acos;
137 using ::sinh; using ::cosh;
138 using ::floor; using ::fmod; using ::modf;
139 }
140#endif
141
142
143/*! \defgroup limitMacros Numeric limits
144
145 Some compilers do not give an implementation of
146 <code>\<limits\></code> yet. For the code to be portable
147 these macros should be used instead of the corresponding method of
148 <code>std::numeric_limits</code> or the corresponding macro
149 defined in <code><limits.h></code>.
150
151 @{
152*/
153/*! \def QL_MIN_INTEGER
154 Defines the value of the largest representable negative integer value
155*/
156/*! \def QL_MAX_INTEGER
157 Defines the value of the largest representable integer value
158*/
159/*! \def QL_MIN_REAL
160 Defines the value of the largest representable negative
161 floating-point value
162*/
163/*! \def QL_MIN_POSITIVE_REAL
164 Defines the value of the smallest representable positive double value
165*/
166/*! \def QL_MAX_REAL
167 Defines the value of the largest representable floating-point value
168*/
169/*! \def QL_EPSILON
170 Defines the machine precision for operations over doubles
171*/
172#include <limits>
173// limits used as such
174#define QL_MIN_INTEGER ((std::numeric_limits<QL_INTEGER>::min)())
175#define QL_MAX_INTEGER ((std::numeric_limits<QL_INTEGER>::max)())
176#define QL_MIN_REAL -((std::numeric_limits<QL_REAL>::max)())
177#define QL_MAX_REAL ((std::numeric_limits<QL_REAL>::max)())
178#define QL_MIN_POSITIVE_REAL ((std::numeric_limits<QL_REAL>::min)())
179#define QL_EPSILON ((std::numeric_limits<QL_REAL>::epsilon)())
180/*! @} */
181
182/*! @} */
183
184
185// For the time being we're keeping a QL_DEPRECATED macro because
186// of <https://stackoverflow.com/questions/38378693/>. We need to
187// use it to deprecate constructors until we drop support for VC++2015.
188// Other features (methods, typedefs etc.) can use [[deprecated]] and
189// possibly add a message.
190
191// emit warning when using deprecated features
192// clang-format off
193#if defined(BOOST_MSVC) // Microsoft Visual C++
194# define QL_DEPRECATED __declspec(deprecated)
195# define QL_DEPRECATED_DISABLE_WARNING \
196 __pragma(warning(push)) \
197 __pragma(warning(disable : 4996))
198# define QL_DEPRECATED_ENABLE_WARNING \
199 __pragma(warning(pop))
200#elif defined(__GNUC__)
201# define QL_DEPRECATED __attribute__((deprecated))
202# define QL_DEPRECATED_DISABLE_WARNING \
203 _Pragma("GCC diagnostic push") \
204 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
205# define QL_DEPRECATED_ENABLE_WARNING \
206 _Pragma("GCC diagnostic pop")
207#elif defined(__clang__)
208# define QL_DEPRECATED __attribute__((deprecated))
209# define QL_DEPRECATED_DISABLE_WARNING \
210 _Pragma("clang diagnostic push") \
211 _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
212# define QL_DEPRECATED_ENABLE_WARNING \
213 _Pragma("clang diagnostic pop")
214#else
215// we don't know how to enable it, just define the macros away
216# define QL_DEPRECATED
217# define QL_DEPRECATED_DISABLE_WARNING
218# define QL_DEPRECATED_ENABLE_WARNING
219#endif
220// clang-format on
221
222#endif
223

source code of quantlib/build/ql/qldefines.hpp