From d3a06ba11faf4e5eda874dfa1c59af2bd53d965c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ja=C3=ABl=20Champagne=20Gareau?= Date: Mon, 2 Feb 2026 21:29:31 -0500 Subject: [PATCH] add the zmij algorithm --- benchmarks/CMakeLists.txt | 4 ++++ benchmarks/algorithms.h | 11 ++++++++--- dependencies/CMakeLists.txt | 10 ++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index c277fc4..77f374f 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -88,6 +88,10 @@ else(TARGET swift_lib) endif(TARGET swift_lib) target_include_directories(benchmark_deps INTERFACE ${grisu-exact_SOURCE_DIR}) +add_library(zmij_lib STATIC ${zmij_SOURCE_DIR}/zmij.cc) +target_include_directories(zmij_lib PUBLIC ${zmij_SOURCE_DIR}) +target_link_libraries(benchmark_deps INTERFACE zmij_lib) + target_link_libraries(benchmark PUBLIC benchmark_deps) if(TO_CHARS_OK AND FROM_CHARS_OK) diff --git a/benchmarks/algorithms.h b/benchmarks/algorithms.h index 88e55ca..64801a4 100644 --- a/benchmarks/algorithms.h +++ b/benchmarks/algorithms.h @@ -17,11 +17,10 @@ #include // Netlib #endif -#include - -#include #include +#include +#include "zmij.h" #include "cpp/common/traits.hpp" // Teju Jagua #include "PrintFloat.h" // Dragon4 #include "double-conversion/double-conversion.h" @@ -352,6 +351,11 @@ int ryu(T d, std::span& buffer) { return d2s_buffered_n(d, buffer.data()); } +template +int zmij(T d, std::span& buffer) { + return zmij::write(buffer.data(), buffer.size(), d); +} + template int teju_jagua(T d, std::span& buffer) { const auto fields = teju::traits_t::teju(d); @@ -615,6 +619,7 @@ std::vector> initArgs(bool use_errol = false, size_t repeat = 0, si args.emplace_back("double_conversion" , wrap(s::double_conversion) , true); args.emplace_back("swiftDtoa" , wrap(s::swiftDtoa) , SWIFT_LIB_SUPPORTED); args.emplace_back("yy_double" , wrap(s::yy_double) , YY_DOUBLE_SUPPORTED && std::is_same_v); + args.emplace_back("zmij 1.0" , wrap(s::zmij) , true); args.emplace_back("std::to_chars" , wrap(s::std_to_chars) , TO_CHARS_SUPPORTED); // to_string, snprintf and abseil do not support shortest-length representation // grisu2 does not round-trip correctly diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt index 3dc7f81..72c9c9b 100644 --- a/dependencies/CMakeLists.txt +++ b/dependencies/CMakeLists.txt @@ -73,6 +73,16 @@ FetchContent_MakeAvailable(grisu-exact) set(grisu-exact_SOURCE_DIR ${grisu-exact_SOURCE_DIR} PARENT_SCOPE) message(STATUS "grisu source directory: ${grisu-exact_SOURCE_DIR}") +FetchContent_Declare( + zmij + GIT_REPOSITORY https://github.com/vitaut/zmij + GIT_TAG tags/v1.0 + GIT_SHALLOW TRUE +) +FetchContent_Populate(zmij) +set(zmij_SOURCE_DIR ${zmij_SOURCE_DIR} PARENT_SCOPE) +message(STATUS "zmij source directory: ${zmij_SOURCE_DIR}") + FetchContent_Declare( dragonbox GIT_REPOSITORY https://github.com/jk-jeon/dragonbox