# Changelog¶

## 0.20 (unreleased)¶

### New¶

• mp++ now works with the Intel compiler (#224, tested with icpc (ICC) 19.1.0.166). This includes also support for real128 (with a couple of minor limitations).
• The interoperability of real128 with long double has been improved: it is now supported also on Clang (since version 7) and it does not require mp++ to be configured with the MPPP_WITH_MPFR option any more (#222).
• mp++ now officially supports the ARM (aarch64) and PowerPC (ppc64le) architectures, which have been added to the continuous integration setup (#219).

### Changes¶

• For consistency with C++20, mp++’s concepts now use snake case notation. The concept hierarchy has also been simplified and streamlined (#228).
• BREAKING: the global precision setting mechanism has been removed from real. As a result, the API and behaviour of the real class have undergone a few backwards-incompatible changes (#227).
• The documentation is now using sphinx exclusively, doxygen is not involved any more (#227, #225, #223, #221).
• Various internal simplifications and improvements to real128 (#221).

## 0.19 (2020-02-29)¶

### Changes¶

• The real dilogarithm functions now return NaN if the argument is not less than 1.
• Move more real functions from the header into the compiled library (#216).
• The GCC quadmath library is now a private dependency of the mp++ library (#215).
• The real128 string representation has been changed to use the g format specifier (#213).

### Fix¶

• Fix a compilation warning with GCC 4.8 (#216).
• Fix a couple of real functions returning copies rather than references (#216).
• Various build system/doc fixes and improvements (#214, #215, #216).
• Fix compilation with older Clang versions in C++17 mode (#213).

## 0.18 (2020-02-14)¶

### Changes¶

• Update the internal copy of Catch to the latest version, 2.11.1 (#210).
• mp++’s public headers do not include the quadmath.h header any more. This change greatly improves mp++’s compatibility with Clang when the MPPP_WITH_QUADMATH option is active (#206).
• Continue moving code into the compiled library (#204, #206).
• Enable the C++20 concept declaration syntax if GCC >= 9 is being used (#203).

### Fix¶

• Various build system and documentation improvements (#200, #202).

## 0.17 (2019-09-13)¶

### Changes¶

• On MSVC, use the WIN32_LEAN_AND_MEAN definition (#198).
• Update the internal copy of Catch to the latest version, 2.9.2 (#197).
• Drastically reduce the build time of the test suite by separately compiling the Catch main function (#197).

## 0.16 (2019-05-25)¶

### Fix¶

• Properly set the version numbers for the mp++ dynamic library (#187).

## 0.15 (2019-05-24)¶

### New¶

• Expose the hyperbolic functions from the MPFR API for real (#184).
• Add the possibility of generating Unicode MSVC solutions (#183).
• Finish exposing all the trigonometric functions from the MPFR API for real (#180).
• Add the possibility to build mp++ as a static library (#176).
• Add CircleCI to the continuous integration pipeline (#173).
• Implement the logarithm/exponential functions for real (#172).

### Changes¶

• When compiled with MPFR version 4 or later, mp++ now ensures that thread-local and global caches are freed separately at thread exit and program shutdown (#182).
• Update the internal copy of Catch to the latest version, 2.7.2 (#181).
• The MPFR cleanup function mpfr_free_cache() is now called at the end of every thread which creates at least one real object (#180).
• Implement a specialised version of the swap() primitive for integer and rational (#174).
• Improve the implementation of the less than/greater than operators for integer. Together with the swap() improvements, this change leads to a ~9% decrease in runtime for the integer1_sort_signed benchmark (#174).
• Continue moving code from the headers into the compiled library (#170, #172).

### Fix¶

• Fix two race conditions in the testing code (#181).
• The zero_division_error exception is now correctly marked as visible (#180).
• Add a workaround for a clang-cl bug (#179).
• Various build system and documentation improvements (#172).
• Fix a warning when building mp++ with older MSVC versions (#170).

## 0.14 (2019-04-11)¶

### Changes¶

• mp++ does not depend on the DbgHelp library on Windows any more (#169).
• BREAKING: mp++ has now a compiled component. In order to use mp++, you will now have to both include the mp++ headers and link to the mp++ library (#169).
• Various improvements to the benchmarks (#166).
• BREAKING: the input stream operators have been removed from all classes (#161).

### Fix¶

• Fix an issue in the build system when compiling the unit tests in release mode with MSVC (#164).
• Fixes for the demangler on OSX when 128-bit integers are involved (#163).
• Fix a build issue on OSX when the compiler is not Xcode (#161).

## 0.13 (2019-03-13)¶

### Changes¶

• Add a tutorial for real128 (#160).
• Various build system improvements (#159).
• Update the internal copy of Catch to the latest version, 2.5.0 (#158).

### Fix¶

• Fix a compilation error when using booleans as second arguments in the pow() and binomial() overloads of integer (#162).
• Work around a compilation error on MSVC when using C++17 (#162).
• Various documentation fixes (#160).

## 0.12 (2018-10-11)¶

### Fix¶

• Fix various warnings issued by Clang 7 in the unit tests (#157).

## 0.11 (2018-05-22)¶

### Changes¶

• The build system should now detect MPIR installations when looking for GMP (#139).
• Update the internal copy of Catch to the latest version, 2.2.2 (#137).

### Fix¶

• Fix a couple of missing inline specifiers in the tests (#143).
• Fix a missing noexcept in the move constructor of real128 (#138).

## 0.10 (2018-04-06)¶

### Changes¶

• BREAKING: the add_ui() function now requires an unsigned integral as the third argument (previously, the function could be invoked with a signed integral argument thanks to C++’s conversion rules).

### Fix¶

• Fix a test failure on FreeBSD (#134).
• Various small documentation fixes (#130, #135).
• Fix demangling failures for 128-bit integers in OSX (#128).

## 0.9 (2018-02-25)¶

### New¶

• Add a couple of benchmarks against hardware integer types (#124).

### Changes¶

• The mppp::string_type concept is now satisfied by cv qualified types as well (#127).
• Add a leading mppp:: to the names of mp++’s classes in the pybind11 custom type casters (#120). This should be only a cosmetic change.
• Update the internal copy of Catch to the latest version, 2.1.1 (#120).
• Small tweaks/improvements to the build system and to the docs (#118, #120, #121, #124, #126).

### Fix¶

• Fix a potential bug in the real printing code (#123).
• Fix a potential name shadowing issue in the pybind11 integration utilities (#125).

## 0.8 (2018-01-26)¶

### New¶

• Add a function to check if a real is equal to one (#117).
• The pybind11 integration utilities now automatically translate mp++ exceptions into appropriate Python exceptions (#115).
• Expose various internal type traits in the public API (#114).
• Add an implementation of the binomial coefficient for rational top arguments (#113).

### Changes¶

• When C++ concepts are enabled, various functions now use automatically-deduced return types to simplify the implementation and improve the generated documentation (#114).
• In the CMake config-file package produced by the installation process, ensure that the installed package version is considered compatible with any other version with the same major version number (#113).

### Fix¶

• Fix a compilation error in the in-place operators of real when using concepts (#116).
• Fix a compilation error in the pybind11 utilities when mp++ is configured with quadmath support but without MPFR (#114).

## 0.7 (2018-01-11)¶

### Changes¶

• Various updates to the documentation and to the benchmarks (#107, #108).
• Add an internal demangling utility to improve the quality of the error messages (#105).
• Various performance improvements for integer division, fused multiply-add, left bit shift, addition and multiplication (#103, #106, #108).
• Improve the detection of the availability of the thread_local keyword on recent Xcode versions (#99).

## 0.5 (2017-11-07)¶

### Changes¶

• Use the sphinx bootstrap theme for the html documentation (#71).
• Various simplifications in the rational API (#66).
• Introduce a string_type concept and use it to reduce the number of overloads in the constructors/assignment operators from string (#63, #64).
• The integer functions accepting the return value as a parameter will now demote a return value with dynamic storage to static storage if the other arguments all have static storage (#58).
• The free functions for integer and rational now return a reference to the return value, rather than void (#56).
• Performance improvements and code simplifications for integer division (#55).
• Minor improvements in the static checks for the expected layouts of mpz_t and mpq_t (#53, #42).
• Enable additional compiler warning flags in debug builds for GCC (#52).
• BREAKING: various improvements/changes to the bit shifting functions for integer, and the exception raised by the bit shifting operators is not any more std::domain_error, it is now std::overflow_error (#48).
• Various updates to the benchmarks (#39).
• Use various C++17 standard library bits if available, and improve general C++17 compatibility (#31, #37).
• Update the internal copy of Catch to the latest version, 1.9.7 (#36).
• Bump up the minimum required CMake version to 3.3 (#31).
• Performance improvements and simplifications in the rational constructors and assignment operators (#28, #32).

### Fix¶

• Fixes/improvements in the support for long double (#50, #54).
• Fix the compilation of the tests on Clang 5 (#43).
• Fix too lax constraints in the implementation of in-place operators for integer and rational (#41).
• Fix the PDF build of the documentation (#39).
• Fix a few missing inline specifiers (#38, #41).
• Fix C++ version detection on MSVC (#36).
• Fix missing tests for rational hashing (#29).
• Fix some MSVC warnings when compiling the tests in release mode (#28).
• Various minor documentation fixes.

## 0.4 (2017-07-29)¶

### Changes¶

• Expand CI to include GCC 7 in C++17 mode (#27).
• Improve testing coverage (#25).
• Various extensions to the benchmark suite (#25).
• Various performance improvements in integer thanks to the reduction of the number of branches in the implementation of basic arithmetic for the 1/2-limb specialisations (#25).
• Update the internal copy of Catch to the latest version, 1.9.6 (#24).
• Performance improvements for mppp::integer::size() (#23).
• Performance improvements for the construction/conversion of integer from/to C++ integrals (#23).
• Make sure the MPFR cleanup routine is automatically called on shutdown (#22).
• Performance improvements for mppp::integer::nbits() on GCC and Clang (#17).

### Fix¶

• Fix a build failure on older GMP versions (#25).
• Fix a build system bug when building the benchmarks with older CMake versions (#25).
• Various minor fixes.

## 0.3 (2017-06-12)¶

### Fix¶

• Various small documentation fixes.

## 0.2 (2017-05-09)¶

### New¶

• Provide a CMake config-file package as part of the install process.
• Implement the missing in-place modulo operator with C++ integrals on the left.
• Experimental support for C++ concepts.
• Support the clang-cl compiler on Windows.
• Add in-place arithmetic operators with interoperable types on the left-hand side.
• Add convenience overloads for pow().
• Add functions to test if an integer is equal to -1.
• Add a static member to integer storing the static size.

### Changes¶

• Split out the library in multiple files.
• Rename the mp_integer class to integer.
• Various improvements to the documentation.
• Rework the library interface to use regular functions rather than inline friend functions.
• Change the license to MPL2.
• Remove the allocation cache.
• Remove the custom namespace option.

### Fix¶

• Fix operators example in the documentation.