///////////////////////////////////////////////////////////////////////////////
// Copyright Christopher Kormanyos 2014.
// Copyright John Maddock 2014.
// Copyright Paul Bristow 2014.
// Distributed under the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//

// Implement quadruple-precision std::numeric_limits<> support.

#ifndef BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_
    #define BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_

    #include <boost/math/cstdfloat/cstdfloat_types.hpp>

    #if defined(__GNUC__) && defined(BOOST_MATH_USE_FLOAT128)
    //
    // This is the only way we can avoid
    // warning: non-standard suffix on floating constant [-Wpedantic]
    // when building with -Wall -pedantic.  Neither __extension__
    // nor #pragma diagnostic ignored work :(
    //
    #pragma GCC system_header
    #endif

    #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT) && (!defined(_GLIBCXX_RELEASE) || (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE < 14))

    #include <limits>
    #include <boost/math/tools/nothrow.hpp>

    // Define the name of the global quadruple-precision function to be used for
    // calculating quiet_NaN() in the specialization of std::numeric_limits<>.
    #if defined(__INTEL_COMPILER)
      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
    #elif defined(__GNUC__)
      #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
    #endif

    // Forward declaration of the quadruple-precision square root function.
    extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) BOOST_MATH_NOTHROW;

    namespace std
    {
      template<>
      class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>
      {
      public:
        static constexpr bool                                                 is_specialized           = true;
        static                 boost::math::cstdfloat::detail::float_internal128_t  (min) () noexcept  { return BOOST_CSTDFLOAT_FLOAT128_MIN; }
        static                 boost::math::cstdfloat::detail::float_internal128_t  (max) () noexcept  { return BOOST_CSTDFLOAT_FLOAT128_MAX; }
        static                 boost::math::cstdfloat::detail::float_internal128_t  lowest() noexcept  { return -(max)(); }
        static constexpr int                                                  digits                   = 113;
        static constexpr int                                                  digits10                 = 33;
        static constexpr int                                                  max_digits10             = 36;
        static constexpr bool                                                 is_signed                = true;
        static constexpr bool                                                 is_integer               = false;
        static constexpr bool                                                 is_exact                 = false;
        static constexpr int                                                  radix                    = 2;
        static                 boost::math::cstdfloat::detail::float_internal128_t  epsilon    ()            { return BOOST_CSTDFLOAT_FLOAT128_EPS; }
        static                 boost::math::cstdfloat::detail::float_internal128_t  round_error()            { return BOOST_FLOAT128_C(0.5); }
        static constexpr int                                                  min_exponent             = -16381;
        static constexpr int                                                  min_exponent10           = static_cast<int>((min_exponent * 301L) / 1000L);
        static constexpr int                                                  max_exponent             = +16384;
        static constexpr int                                                  max_exponent10           = static_cast<int>((max_exponent * 301L) / 1000L);
        static constexpr bool                                                 has_infinity             = true;
        static constexpr bool                                                 has_quiet_NaN            = true;
        static constexpr bool                                                 has_signaling_NaN        = false;
        static constexpr float_denorm_style                                   has_denorm               = denorm_present;
        static constexpr bool                                                 has_denorm_loss          = false;
        static                 boost::math::cstdfloat::detail::float_internal128_t  infinity     ()          { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }
        static                 boost::math::cstdfloat::detail::float_internal128_t  quiet_NaN    ()          { return -(::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0))); }
        static                 boost::math::cstdfloat::detail::float_internal128_t  signaling_NaN()          { return BOOST_FLOAT128_C(0.0); }
        static                 boost::math::cstdfloat::detail::float_internal128_t  denorm_min   ()          { return BOOST_CSTDFLOAT_FLOAT128_DENORM_MIN; }
        static constexpr bool                                                 is_iec559                = true;
        static constexpr bool                                                 is_bounded               = true;
        static constexpr bool                                                 is_modulo                = false;
        static constexpr bool                                                 traps                    = false;
        static constexpr bool                                                 tinyness_before          = false;
        static constexpr float_round_style                                    round_style              = round_to_nearest;
      };
    } // namespace std

  #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)

#endif // BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_

