diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ec6142..fc3d237 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,21 +1,26 @@ cmake_minimum_required(VERSION 3.14) - project(fast_float VERSION 8.2.10 LANGUAGES CXX) + +# C++ standard used by the project. +# fast_float itself requires C++11, while some tests/features use newer standards. set(FASTFLOAT_CXX_STANDARD 11 CACHE STRING "the C++ standard to use for fastfloat") set(CMAKE_CXX_STANDARD ${FASTFLOAT_CXX_STANDARD}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + option(FASTFLOAT_TEST "Enable tests" OFF) if(FASTFLOAT_TEST) enable_testing() add_subdirectory(tests) -else(FASTFLOAT_TEST) +else() message(STATUS "Tests are disabled. Set FASTFLOAT_TEST to ON to run tests.") -endif(FASTFLOAT_TEST) +endif() option(FASTFLOAT_SANITIZE "Sanitize addresses" OFF) -if (NOT CMAKE_BUILD_TYPE) +if(NOT CMAKE_BUILD_TYPE) if(FASTFLOAT_SANITIZE) set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) else() @@ -32,57 +37,132 @@ endif() add_library(fast_float INTERFACE) - option(FASTFLOAT_BENCHMARKS "Enable benchmarks" OFF) + if(FASTFLOAT_BENCHMARKS) add_subdirectory(benchmarks) -else(FASTFLOAT_BENCHMARKS) +else() message(STATUS "Benchmarks are disabled. Set FASTFLOAT_BENCHMARKS to ON to build benchmarks (assumes C++17).") -endif(FASTFLOAT_BENCHMARKS) - +endif() add_library(FastFloat::fast_float ALIAS fast_float) + target_include_directories( fast_float INTERFACE $ $ ) + target_compile_features(fast_float INTERFACE cxx_std_11) + if(FASTFLOAT_SANITIZE) - target_compile_options(fast_float INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all) - target_link_libraries(fast_float INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all) - if (CMAKE_COMPILER_IS_GNUCC) - target_link_libraries(fast_float INTERFACE -fuse-ld=gold) + if(MSVC) + target_compile_options( + fast_float + INTERFACE + /fsanitize=address + ) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + target_compile_options( + fast_float + INTERFACE + -fsanitize=address + -fno-omit-frame-pointer + -fsanitize=undefined + -fno-sanitize-recover=all + ) + + target_link_libraries( + fast_float + INTERFACE + -fsanitize=address + -fno-omit-frame-pointer + -fsanitize=undefined + -fno-sanitize-recover=all + ) + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_link_libraries(fast_float INTERFACE -fuse-ld=gold) + endif() endif() endif() -target_compile_options(fast_float INTERFACE $<$,$,19.10>>:/permissive->) +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" + AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.10) + target_compile_options(fast_float INTERFACE /permissive-) +endif() if(FASTFLOAT_INSTALL) include(CMakePackageConfigHelpers) - set(FASTFLOAT_VERSION_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/module/FastFloatConfigVersion.cmake") - set(FASTFLOAT_PROJECT_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/module/FastFloatConfig.cmake") - set(FASTFLOAT_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATAROOTDIR}/cmake/FastFloat") + set( + FASTFLOAT_VERSION_CONFIG + "${CMAKE_CURRENT_BINARY_DIR}/module/FastFloatConfigVersion.cmake" + ) - if(${CMAKE_VERSION} VERSION_LESS "3.14") - write_basic_package_version_file("${FASTFLOAT_VERSION_CONFIG}" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) + set( + FASTFLOAT_PROJECT_CONFIG + "${CMAKE_CURRENT_BINARY_DIR}/module/FastFloatConfig.cmake" + ) + + set( + FASTFLOAT_CONFIG_INSTALL_DIR + "${CMAKE_INSTALL_DATAROOTDIR}/cmake/FastFloat" + ) + + if(CMAKE_VERSION VERSION_LESS "3.14") + write_basic_package_version_file( + "${FASTFLOAT_VERSION_CONFIG}" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) else() - write_basic_package_version_file("${FASTFLOAT_VERSION_CONFIG}" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ARCH_INDEPENDENT) + write_basic_package_version_file( + "${FASTFLOAT_VERSION_CONFIG}" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ARCH_INDEPENDENT + ) endif() - configure_package_config_file("cmake/config.cmake.in" - "${FASTFLOAT_PROJECT_CONFIG}" - INSTALL_DESTINATION "${FASTFLOAT_CONFIG_INSTALL_DIR}") - install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/fast_float" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - install(FILES "${FASTFLOAT_PROJECT_CONFIG}" "${FASTFLOAT_VERSION_CONFIG}" DESTINATION "${FASTFLOAT_CONFIG_INSTALL_DIR}") - install(EXPORT ${PROJECT_NAME}-targets NAMESPACE FastFloat:: DESTINATION "${FASTFLOAT_CONFIG_INSTALL_DIR}") + configure_package_config_file( + "cmake/config.cmake.in" + "${FASTFLOAT_PROJECT_CONFIG}" + INSTALL_DESTINATION "${FASTFLOAT_CONFIG_INSTALL_DIR}" + ) - install(TARGETS fast_float - EXPORT ${PROJECT_NAME}-targets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + install( + DIRECTORY + "${PROJECT_SOURCE_DIR}/include/fast_float" + DESTINATION + "${CMAKE_INSTALL_INCLUDEDIR}" + ) + + install( + FILES + "${FASTFLOAT_PROJECT_CONFIG}" + "${FASTFLOAT_VERSION_CONFIG}" + DESTINATION + "${FASTFLOAT_CONFIG_INSTALL_DIR}" + ) + + install( + EXPORT + ${PROJECT_NAME}-targets + NAMESPACE + FastFloat:: + DESTINATION + "${FASTFLOAT_CONFIG_INSTALL_DIR}" + ) + + install( + TARGETS + fast_float + EXPORT + ${PROJECT_NAME}-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() diff --git a/include/fast_float/constexpr_feature_detect.h b/include/fast_float/constexpr_feature_detect.h index 84c1041..f50efa8 100644 --- a/include/fast_float/constexpr_feature_detect.h +++ b/include/fast_float/constexpr_feature_detect.h @@ -102,43 +102,25 @@ #endif // C++20 consteval. -// -// consteval is a language feature. It must be detected independently from -// std::is_constant_evaluated() and from the C++20 constexpr library. -#if FASTFLOAT_CXX20 -#if defined(__apple_build_version__) && __apple_build_version__ < 14000029L -#define FASTFLOAT_USE_CONSTEVAL 0 // consteval is broken in Apple clang < 14. -#elif defined(_MSC_VER) && !defined(__clang__) && _MSC_VER < 1940 -#define FASTFLOAT_USE_CONSTEVAL \ - 0 // consteval is broken in some MSVC2022 versions. -#elif defined(__cpp_consteval) && __cpp_consteval >= 201811L -#define FASTFLOAT_USE_CONSTEVAL 1 -#else -#define FASTFLOAT_USE_CONSTEVAL 0 -#endif -#else -#define FASTFLOAT_USE_CONSTEVAL 0 -#endif - -#if FASTFLOAT_USE_CONSTEVAL +#if defined(__cpp_consteval) && __cpp_consteval >= 201811L #define FASTFLOAT_CONSTEVAL consteval #else #define FASTFLOAT_CONSTEVAL #endif -// C++20 constexpr. -// -// This is deliberately independent from consteval. The functions using -// FASTFLOAT_CONSTEXPR20 also require the corresponding C++20 constexpr -// library facilities. -#if FASTFLOAT_CXX20 && FASTFLOAT_HAS_IS_CONSTANT_EVALUATED && \ - FASTFLOAT_HAS_BIT_CAST && defined(__cpp_lib_constexpr_algorithms) && \ - __cpp_lib_constexpr_algorithms >= 201806L +// C++20 constexpr function support. +#if defined(_MSC_VER) +#if defined(_MSVC_LANG) && _MSVC_LANG >= 202002L +#define FASTFLOAT_CONSTEXPR20 constexpr +#else +#define FASTFLOAT_CONSTEXPR20 +#endif +#elif defined(__cpp_constexpr) && __cpp_constexpr >= 201907L +#define FASTFLOAT_CONSTEXPR20 constexpr +#elif defined(__cplusplus) && __cplusplus >= 202002L #define FASTFLOAT_CONSTEXPR20 constexpr -#define FASTFLOAT_IS_CONSTEXPR 1 #else #define FASTFLOAT_CONSTEXPR20 -#define FASTFLOAT_IS_CONSTEXPR 0 #endif // C++20 std::byteswap