
/*
 Copyright (C) 2004, 2005 StatPro Italia srl

 This file is part of QuantLib, a free-software/open-source library
 for financial quantitative analysts and developers - http://quantlib.org/

 QuantLib is free software: you can redistribute it and/or modify it
 under the terms of the QuantLib license.  You should have received a
 copy of the license along with this program; if not, please email
 <quantlib-dev@lists.sf.net>. The license is also available online at
 <http://quantlib.org/license.shtml>.

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the license for more details.
*/

/*! \page config User configuration

    A number of macros is provided for user configuration.  Defining
    or undefining such macros triggers variations in some library
    functionality.

    When using CMake, they can be set to `ON` or `OFF` as properties.

    Under a Linux/Unix system, they are (un)set by `configure`;
    run
    \code
    ./configure --help
    \endcode
    for a list of corresponding command-line options.

    Under a Windows system, they must be (un)defined by editing the
    file `<ql/userconfig.hpp>` and commenting or uncommenting the
    relevant lines.

    Such macros include:

    \code
    #define QL_ERROR_FUNCTIONS
    \endcode
    If defined, function information is added to the error messages
    thrown by the library. Undefined by default.

    \code
    #define QL_ERROR_LINES
    \endcode
    If defined, file and line information is added to the error
    messages thrown by the library. Undefined by default.

    \code
    #define QL_ENABLE_TRACING
    \endcode
    If enabled, tracing messages might be emitted by the library
    depending on run-time settings. Enabling this option can degrade
    performance. Undefined by default.

    \code
    #define QL_EXTRA_SAFETY_CHECKS
    \endcode
    If defined, extra run-time checks are added to a few
    functions. This can prevent their inlining and degrade
    performance. Undefined by default.

    \code
    #define QL_USE_INDEXED_COUPON
    \endcode
    If defined, indexed coupons (see the documentation) are used in
    floating legs.  If undefined (the default), par coupons are used.

    \code
    #define QL_ENABLE_SESSIONS
    \endcode
    If defined, singletons will return different instances for
    different threads; in particular, this means that the evaluation
    date, the stored index fixings and any other settings will be
    per-thread. Undefined by default.

    \code
    #define QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN
    \endcode
    If defined, a thread-safe (but less performant) version of the
    observer pattern is used. You should define it if you want to
    use %QuantLib via the SWIG layer within the JVM or .NET eco system
    or any environment with an async garbage collector.  Undefined by
    default.  If defined together with `QL_USE_STD_SHARED_PTR`, it requires
    at least C++17.

    \code
    #define QL_HIGH_RESOLUTION_DATE
    \endcode
    If defined, date objects support an intraday datetime
    resolution down to microseconds.  Strictly monotone daycounters
    (`Actual360`, `Actual365Fixed` and `ActualActual`) will take the
    additional information into account and allow for accurate
    intraday pricing.  If undefined (the default) the smallest
    resolution of date objects is a single day.  Intraday
    datetime resolution is experimental.

    \code
    #define QL_THROW_IN_CYCLES
    \endcode
    If defined, lazy objects will raise an exception when they detect
    a notification cycle which would result in an infinite recursion
    loop. If undefined (the default), they will break the recursion
    without throwing.  Enabling this option is recommended but might
    cause existing code to throw.

    \code
    #define QL_FASTER_LAZY_OBJECTS
    \endcode
    If defined (the default), lazy objects will forward the first
    notification received, and discard the others until recalculated;
    the rationale is that observers were already notified, and don't
    need further notifications until they recalculate, at which point
    this object would be recalculated too.  After recalculation, this
    object would again forward the first notification received.
    Although not always correct, this behavior is a lot faster and
    thus is the current default.

    \code
    #define QL_USE_STD_SHARED_PTR
    \endcode
    If defined, `std::shared_ptr` and related classes and functions are
    used instead of `boost::shared_ptr`. If disabled (the
    default) the Boost facilities are used. Note that `std::shared_ptr`
    does not check access and can cause segmentation faults.

    \code
    #define QL_USE_STD_FUNCTION
    \endcode
    If defined (the default), `std::function`, `std::bind` and related
    classes and functions are used. If disabled, the corresponding
    Boost facilities are used instead.

    \code
    #define QL_USE_STD_TUPLE
    \endcode
    If defined (the default), `std::tuple` and related classes and
    functions are used. If disabled, the corresponding Boost
    facilities are used instead..

    \code
    #define QL_USE_STD_ANY
    \endcode
    If enabled, `std::any` and related classes and functions will be
    used instead of `boost::any`. This requires C++17. If disabled
    (the default) the Boost facilities are used.

    \code
    #define QL_USE_STD_OPTIONAL
    \endcode
    If enabled, `std::optional` and related classes and functions will
    be used instead of `boost::optional`. This requires C++17. If
    disabled (the default) the Boost facilities are used.

    \code
    #define QL_NULL_AS_FUNCTIONS
    \endcode
    If defined, `Null` will be implemented as a set of template
    functions.  This allows the code to work with user-defined `Real`
    types but was reported to cause internal compiler errors with
    Visual C++ 2022 in some cases.  If disabled (the default) `Null`
    will be implemented as a class template, as in previous releases.

    \code
    #define QL_ENABLE_PARALLEL_UNIT_TEST_RUNNER
    \endcode
    Define this to enable the parallel unit test runner. Undefined by
    default.
*/

