From 2b1b277a0bdcdb57f901f45ecacbc20675d88b50 Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland Date: Fri, 18 Sep 2020 12:36:00 -0400 Subject: [PATCH 1/6] Add cmake. --- CMakeLists.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b1fcca7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.10.0) + +project( + mpreal + VERSION 3.6.7 + LANGUAGES CXX +) + +set(CMAKE_CXX_STANDARD 17) + +add_library(mpreal INTERFACE) +target_include_directories(mpreal INTERFACE .) + +add_executable(mpreal_example example/example.cpp) +target_link_libraries(mpreal_example mpreal mpfr) From 99cba719396eaf18ad7d71dab859eca63b17003b Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Thu, 3 Feb 2022 19:41:18 -0500 Subject: [PATCH 2/6] New style casts. --- mpreal.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mpreal.h b/mpreal.h index 544f4c3..ba85a90 100644 --- a/mpreal.h +++ b/mpreal.h @@ -154,8 +154,8 @@ class mpreal { public: // Get default rounding mode & precision - inline static mp_rnd_t get_default_rnd() { return (mp_rnd_t)(mpfr_get_default_rounding_mode()); } - inline static mp_prec_t get_default_prec() { return (mpfr_get_default_prec)(); } + inline static mp_rnd_t get_default_rnd() { return static_cast(mpfr_get_default_rounding_mode()); } + inline static mp_prec_t get_default_prec() { return (mpfr_get_default_prec)(); } // Constructors && type conversions mpreal(); @@ -304,12 +304,12 @@ class mpreal { #if defined (MPREAL_HAVE_EXPLICIT_CONVERTERS) explicit operator bool () const { return toBool(); } - explicit operator signed char () const { return (signed char)toLong(); } - explicit operator unsigned char () const { return (unsigned char)toULong(); } - explicit operator short () const { return (short)toLong(); } - explicit operator unsigned short () const { return (unsigned short)toULong();} - explicit operator int () const { return (int)toLong(); } - explicit operator unsigned int () const { return (unsigned int)toULong(); } + explicit operator signed char () const { return static_cast(toLong()); } + explicit operator unsigned char () const { return static_cast(toULong()); } + explicit operator short () const { return static_cast(toLong()); } + explicit operator unsigned short () const { return static_cast(toULong());} + explicit operator int () const { return static_cast(toLong()); } + explicit operator unsigned int () const { return static_cast(toULong()); } explicit operator long () const { return toLong(); } explicit operator unsigned long () const { return toULong(); } explicit operator long long () const { return toLLong(); } @@ -631,7 +631,7 @@ inline mpreal::mpreal(const mpfr_t u, bool shared) inline mpreal::mpreal(const mpf_t u) { - mpfr_init2(mpfr_ptr(),(mp_prec_t) mpf_get_prec(u)); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t) + mpfr_init2(mpfr_ptr(),static_cast(mpf_get_prec(u))); // (gmp: mp_bitcnt_t) unsigned long -> long (mpfr: mp_prec_t) mpfr_set_f(mpfr_ptr(),u,mpreal::get_default_rnd()); MPREAL_MSVC_DEBUGVIEW_CODE; @@ -2580,7 +2580,7 @@ inline const mpreal sum (const mpreal tab[], const unsigned long int n, int& sta p[i] = tab[i].mpfr_srcptr(); mpreal x; - status = mpfr_sum(x.mpfr_ptr(), (mpfr_ptr*)p, n, mode); + status = mpfr_sum(x.mpfr_ptr(), const_cast(p), n, mode); delete [] p; return x; @@ -3269,8 +3269,8 @@ namespace std // Please note, exponent range is not fixed in MPFR static const int min_exponent = MPFR_EMIN_DEFAULT; static const int max_exponent = MPFR_EMAX_DEFAULT; - MPREAL_PERMISSIVE_EXPR static const int min_exponent10 = (int) (MPFR_EMIN_DEFAULT * 0.3010299956639811); - MPREAL_PERMISSIVE_EXPR static const int max_exponent10 = (int) (MPFR_EMAX_DEFAULT * 0.3010299956639811); + MPREAL_PERMISSIVE_EXPR static const int min_exponent10 = static_cast(MPFR_EMIN_DEFAULT * 0.3010299956639811); + MPREAL_PERMISSIVE_EXPR static const int max_exponent10 = static_cast(MPFR_EMAX_DEFAULT * 0.3010299956639811); #ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS From 68e4b8a528eca758ad6ef07e83082e6d4f7c3763 Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Mon, 14 Feb 2022 16:15:03 -0500 Subject: [PATCH 3/6] Make mpreal optional if gmp and mpfr not found. --- CMakeLists.txt | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1fcca7..571b1d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,30 @@ project( set(CMAKE_CXX_STANDARD 17) -add_library(mpreal INTERFACE) -target_include_directories(mpreal INTERFACE .) +find_package(GMP) +if (GMP_FOUND) + message(STATUS "GMP found!") +else() + message(WARNING "GMP not found!") +endif() -add_executable(mpreal_example example/example.cpp) -target_link_libraries(mpreal_example mpreal mpfr) +find_package(MPFR) +if (MPFR_FOUND) + message(STATUS "MPFR found!") +else() + message(WARNING "MPFR not found!") +endif() + +set(HAVE_MPREAL FALSE CACHE BOOL "Have working mpreal" FORCE) +if (GMP_FOUND AND MPFR_FOUND) + set(HAVE_MPREAL TRUE CACHE BOOL "Have working mpreal" FORCE) + message(STATUS "MPReal enabled!") + + add_library(mpreal INTERFACE) + target_include_directories(mpreal INTERFACE .) + + add_executable(mpreal_example example/example.cpp) + target_link_libraries(mpreal_example mpreal mpfr) +else() + message(WARNING "MPReal not enabled!") +endif() From d6d9b9b39130766b32ac934759e0ca1cfa071966 Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Mon, 14 Feb 2022 18:02:42 -0500 Subject: [PATCH 4/6] Make this independent and able to detect gmp and mpfr. --- CMakeLists.txt | 8 ++--- cmake/FindGMP.cmake | 21 +++++++++++ cmake/FindMPFR.cmake | 83 ++++++++++++++++++++++++++++++++++++++++++++ cmake/README.md | 4 +++ 4 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 cmake/FindGMP.cmake create mode 100644 cmake/FindMPFR.cmake create mode 100644 cmake/README.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 571b1d8..a10a3ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,8 @@ project( ) set(CMAKE_CXX_STANDARD 17) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) find_package(GMP) if (GMP_FOUND) @@ -22,16 +24,10 @@ else() message(WARNING "MPFR not found!") endif() -set(HAVE_MPREAL FALSE CACHE BOOL "Have working mpreal" FORCE) if (GMP_FOUND AND MPFR_FOUND) - set(HAVE_MPREAL TRUE CACHE BOOL "Have working mpreal" FORCE) - message(STATUS "MPReal enabled!") - add_library(mpreal INTERFACE) target_include_directories(mpreal INTERFACE .) add_executable(mpreal_example example/example.cpp) target_link_libraries(mpreal_example mpreal mpfr) -else() - message(WARNING "MPReal not enabled!") endif() diff --git a/cmake/FindGMP.cmake b/cmake/FindGMP.cmake new file mode 100644 index 0000000..1f02739 --- /dev/null +++ b/cmake/FindGMP.cmake @@ -0,0 +1,21 @@ +# Try to find the GNU Multiple Precision Arithmetic Library (GMP) +# See http://gmplib.org/ + +if (GMP_INCLUDES AND GMP_LIBRARIES) + set(GMP_FIND_QUIETLY TRUE) +endif (GMP_INCLUDES AND GMP_LIBRARIES) + +find_path(GMP_INCLUDES + NAMES + gmp.h + PATHS + $ENV{GMPDIR} + ${INCLUDE_INSTALL_DIR} +) + +find_library(GMP_LIBRARIES gmp PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GMP DEFAULT_MSG + GMP_INCLUDES GMP_LIBRARIES) +mark_as_advanced(GMP_INCLUDES GMP_LIBRARIES) diff --git a/cmake/FindMPFR.cmake b/cmake/FindMPFR.cmake new file mode 100644 index 0000000..aa4c2cd --- /dev/null +++ b/cmake/FindMPFR.cmake @@ -0,0 +1,83 @@ +# Try to find the MPFR library +# See http://www.mpfr.org/ +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(MPFR 2.3.0) +# to require version 2.3.0 to newer of MPFR. +# +# Once done this will define +# +# MPFR_FOUND - system has MPFR lib with correct version +# MPFR_INCLUDES - the MPFR include directory +# MPFR_LIBRARIES - the MPFR library +# MPFR_VERSION - MPFR version + +# Copyright (c) 2006, 2007 Montel Laurent, +# Copyright (c) 2008, 2009 Gael Guennebaud, +# Copyright (c) 2010 Jitse Niesen, +# Redistribution and use is allowed according to the terms of the BSD license. + +# Set MPFR_INCLUDES + +find_path(MPFR_INCLUDES + NAMES + mpfr.h + PATHS + $ENV{GMPDIR} + ${INCLUDE_INSTALL_DIR} +) + +# Set MPFR_FIND_VERSION to 1.0.0 if no minimum version is specified + +if(NOT MPFR_FIND_VERSION) + if(NOT MPFR_FIND_VERSION_MAJOR) + set(MPFR_FIND_VERSION_MAJOR 1) + endif(NOT MPFR_FIND_VERSION_MAJOR) + if(NOT MPFR_FIND_VERSION_MINOR) + set(MPFR_FIND_VERSION_MINOR 0) + endif(NOT MPFR_FIND_VERSION_MINOR) + if(NOT MPFR_FIND_VERSION_PATCH) + set(MPFR_FIND_VERSION_PATCH 0) + endif(NOT MPFR_FIND_VERSION_PATCH) + + set(MPFR_FIND_VERSION "${MPFR_FIND_VERSION_MAJOR}.${MPFR_FIND_VERSION_MINOR}.${MPFR_FIND_VERSION_PATCH}") +endif(NOT MPFR_FIND_VERSION) + + +if(MPFR_INCLUDES) + + # Set MPFR_VERSION + + file(READ "${MPFR_INCLUDES}/mpfr.h" _mpfr_version_header) + + string(REGEX MATCH "define[ \t]+MPFR_VERSION_MAJOR[ \t]+([0-9]+)" _mpfr_major_version_match "${_mpfr_version_header}") + set(MPFR_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+MPFR_VERSION_MINOR[ \t]+([0-9]+)" _mpfr_minor_version_match "${_mpfr_version_header}") + set(MPFR_MINOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+MPFR_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpfr_patchlevel_version_match "${_mpfr_version_header}") + set(MPFR_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}") + + set(MPFR_VERSION ${MPFR_MAJOR_VERSION}.${MPFR_MINOR_VERSION}.${MPFR_PATCHLEVEL_VERSION}) + + # Check whether found version exceeds minimum version + + if(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) + set(MPFR_VERSION_OK FALSE) + message(STATUS "MPFR version ${MPFR_VERSION} found in ${MPFR_INCLUDES}, " + "but at least version ${MPFR_FIND_VERSION} is required") + else(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) + set(MPFR_VERSION_OK TRUE) + endif(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) + +endif(MPFR_INCLUDES) + +# Set MPFR_LIBRARIES + +find_library(MPFR_LIBRARIES mpfr PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR}) + +# Epilogue + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MPFR DEFAULT_MSG + MPFR_INCLUDES MPFR_LIBRARIES MPFR_VERSION_OK) +mark_as_advanced(MPFR_INCLUDES MPFR_LIBRARIES) diff --git a/cmake/README.md b/cmake/README.md new file mode 100644 index 0000000..50b8ecb --- /dev/null +++ b/cmake/README.md @@ -0,0 +1,4 @@ +These are from eigen: + +https://github.com/libigl/eigen/blob/master/cmake/FindMPFR.cmake +https://github.com/libigl/eigen/blob/master/cmake/FindGMP.cmake From 11495b82dcad6b41f32356cb8f8d36a0d60891ba Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Wed, 2 Mar 2022 10:13:37 -0500 Subject: [PATCH 5/6] Remove the C++ standard from the CMakeLists.txt - mpreal should work all the way back to 2003. --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a10a3ec..6622355 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,6 @@ project( VERSION 3.6.7 LANGUAGES CXX ) - -set(CMAKE_CXX_STANDARD 17) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) From 7e1e81ffcfcc6df350280d8e9983a9b4cce9be38 Mon Sep 17 00:00:00 2001 From: Ed Smith-Rowland <3dw4rd@verizon.net> Date: Wed, 2 Mar 2022 10:39:18 -0500 Subject: [PATCH 6/6] Remove the GMP and MPFR scripts also. --- CMakeLists.txt | 26 +++----------- cmake/FindGMP.cmake | 21 ----------- cmake/FindMPFR.cmake | 83 -------------------------------------------- cmake/README.md | 4 --- 4 files changed, 4 insertions(+), 130 deletions(-) delete mode 100644 cmake/FindGMP.cmake delete mode 100644 cmake/FindMPFR.cmake delete mode 100644 cmake/README.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 6622355..6a00268 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,27 +5,9 @@ project( VERSION 3.6.7 LANGUAGES CXX ) - -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -find_package(GMP) -if (GMP_FOUND) - message(STATUS "GMP found!") -else() - message(WARNING "GMP not found!") -endif() +add_library(mpreal INTERFACE) +target_include_directories(mpreal INTERFACE .) -find_package(MPFR) -if (MPFR_FOUND) - message(STATUS "MPFR found!") -else() - message(WARNING "MPFR not found!") -endif() - -if (GMP_FOUND AND MPFR_FOUND) - add_library(mpreal INTERFACE) - target_include_directories(mpreal INTERFACE .) - - add_executable(mpreal_example example/example.cpp) - target_link_libraries(mpreal_example mpreal mpfr) -endif() +add_executable(mpreal_example example/example.cpp) +target_link_libraries(mpreal_example mpreal mpfr) diff --git a/cmake/FindGMP.cmake b/cmake/FindGMP.cmake deleted file mode 100644 index 1f02739..0000000 --- a/cmake/FindGMP.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# Try to find the GNU Multiple Precision Arithmetic Library (GMP) -# See http://gmplib.org/ - -if (GMP_INCLUDES AND GMP_LIBRARIES) - set(GMP_FIND_QUIETLY TRUE) -endif (GMP_INCLUDES AND GMP_LIBRARIES) - -find_path(GMP_INCLUDES - NAMES - gmp.h - PATHS - $ENV{GMPDIR} - ${INCLUDE_INSTALL_DIR} -) - -find_library(GMP_LIBRARIES gmp PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(GMP DEFAULT_MSG - GMP_INCLUDES GMP_LIBRARIES) -mark_as_advanced(GMP_INCLUDES GMP_LIBRARIES) diff --git a/cmake/FindMPFR.cmake b/cmake/FindMPFR.cmake deleted file mode 100644 index aa4c2cd..0000000 --- a/cmake/FindMPFR.cmake +++ /dev/null @@ -1,83 +0,0 @@ -# Try to find the MPFR library -# See http://www.mpfr.org/ -# -# This module supports requiring a minimum version, e.g. you can do -# find_package(MPFR 2.3.0) -# to require version 2.3.0 to newer of MPFR. -# -# Once done this will define -# -# MPFR_FOUND - system has MPFR lib with correct version -# MPFR_INCLUDES - the MPFR include directory -# MPFR_LIBRARIES - the MPFR library -# MPFR_VERSION - MPFR version - -# Copyright (c) 2006, 2007 Montel Laurent, -# Copyright (c) 2008, 2009 Gael Guennebaud, -# Copyright (c) 2010 Jitse Niesen, -# Redistribution and use is allowed according to the terms of the BSD license. - -# Set MPFR_INCLUDES - -find_path(MPFR_INCLUDES - NAMES - mpfr.h - PATHS - $ENV{GMPDIR} - ${INCLUDE_INSTALL_DIR} -) - -# Set MPFR_FIND_VERSION to 1.0.0 if no minimum version is specified - -if(NOT MPFR_FIND_VERSION) - if(NOT MPFR_FIND_VERSION_MAJOR) - set(MPFR_FIND_VERSION_MAJOR 1) - endif(NOT MPFR_FIND_VERSION_MAJOR) - if(NOT MPFR_FIND_VERSION_MINOR) - set(MPFR_FIND_VERSION_MINOR 0) - endif(NOT MPFR_FIND_VERSION_MINOR) - if(NOT MPFR_FIND_VERSION_PATCH) - set(MPFR_FIND_VERSION_PATCH 0) - endif(NOT MPFR_FIND_VERSION_PATCH) - - set(MPFR_FIND_VERSION "${MPFR_FIND_VERSION_MAJOR}.${MPFR_FIND_VERSION_MINOR}.${MPFR_FIND_VERSION_PATCH}") -endif(NOT MPFR_FIND_VERSION) - - -if(MPFR_INCLUDES) - - # Set MPFR_VERSION - - file(READ "${MPFR_INCLUDES}/mpfr.h" _mpfr_version_header) - - string(REGEX MATCH "define[ \t]+MPFR_VERSION_MAJOR[ \t]+([0-9]+)" _mpfr_major_version_match "${_mpfr_version_header}") - set(MPFR_MAJOR_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+MPFR_VERSION_MINOR[ \t]+([0-9]+)" _mpfr_minor_version_match "${_mpfr_version_header}") - set(MPFR_MINOR_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+MPFR_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpfr_patchlevel_version_match "${_mpfr_version_header}") - set(MPFR_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}") - - set(MPFR_VERSION ${MPFR_MAJOR_VERSION}.${MPFR_MINOR_VERSION}.${MPFR_PATCHLEVEL_VERSION}) - - # Check whether found version exceeds minimum version - - if(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) - set(MPFR_VERSION_OK FALSE) - message(STATUS "MPFR version ${MPFR_VERSION} found in ${MPFR_INCLUDES}, " - "but at least version ${MPFR_FIND_VERSION} is required") - else(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) - set(MPFR_VERSION_OK TRUE) - endif(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION}) - -endif(MPFR_INCLUDES) - -# Set MPFR_LIBRARIES - -find_library(MPFR_LIBRARIES mpfr PATHS $ENV{GMPDIR} ${LIB_INSTALL_DIR}) - -# Epilogue - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MPFR DEFAULT_MSG - MPFR_INCLUDES MPFR_LIBRARIES MPFR_VERSION_OK) -mark_as_advanced(MPFR_INCLUDES MPFR_LIBRARIES) diff --git a/cmake/README.md b/cmake/README.md deleted file mode 100644 index 50b8ecb..0000000 --- a/cmake/README.md +++ /dev/null @@ -1,4 +0,0 @@ -These are from eigen: - -https://github.com/libigl/eigen/blob/master/cmake/FindMPFR.cmake -https://github.com/libigl/eigen/blob/master/cmake/FindGMP.cmake