mirror of
https://github.com/nlohmann/json.git
synced 2026-10-15 02:37:13 +00:00
* Write doubles with the shortest digits (Żmij), digits in registers Write doubles with the conversion of Zmij by Victor Zverovich (MIT), ported to C++11 (detail/conversions/zmij.hpp). It finds the shortest decimal that reads back as the same double, and the closest one if there are several. Grisu2, used until now, is fast but not always shortest: it sometimes writes a 17th digit where 16 suffice, or a last digit that is not the closest. The layout is unchanged (1.5, 100.0, 1e+100, -0.0); float keeps Grisu2. Digits are converted eight at a time with the BCD conversion of Xiang JunBo, as in Zmij, and written with one byte swap per eight digits and fixed-size moves instead of per-digit loops. Leading and trailing zeros are counted from those bytes. to_chars() uses a local buffer when the caller's is shorter than the 41 bytes this may write. The powers of ten come from the number-parsing table, adjusted where it holds values rounded up, and extended with Zmij's compressed tables beyond 10^308. write_shortest() converts its 16 digits in one vector register (SSE2 on x86-64, NEON on 64-bit Arm, both baseline) and inserts the decimal point inside the register, avoiding a store-forwarding stall that cost about 25% of the time to write a double. dump() writes floats and integers straight into the serializer's write buffer instead of copying them from a member buffer, and small integers eight digits at a time. read_eight_bytes() and parse_eight_digits() are marked always-inline, which GCC had been calling out of line in the number-parsing loops. Of one million random doubles, about 0.14% are now written with different digits, always to a value that still reads back as the same double. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Fix CI findings in the Zmij writer and its tests - bit_ops.hpp: include macro_scope.hpp (JSON_HEDLEY_ALWAYS_INLINE); fixes IWYU - to_chars.hpp: C4100 for the unused parameter in release builds, clang-tidy sign comparison, cpplint runtime/int, GCC -Wstrict-overflow (unsigned abs) - unit-to_chars.cpp: parse with the library instead of strtod (MinGW's strtod rounds some 16/17 digit inputs wrongly); no floating-point std::to_chars with icpc Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Select the Zmij conversion by a trait, not by the double overload The non-template overloads for double asserted binary64 doubles wherever json.hpp was included, so the library no longer compiled where double is not IEEE 754 binary64 (AVR, -fshort-double). A trait now picks Zmij for any binary64 type, including a long double of that format (MSVC, Apple Arm), and Grisu2 for the others. Remove the unused write_short_decimal, powers_of_ten_16, zmij::decimal, zmij::to_decimal, and shortest_digits(double). Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Credit Zmij's authors in to_chars.hpp, the README, and the license page Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Silence MSVC C4127 for a platform-constant check in the to_chars test Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Regenerate the amalgamated headers Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
90 lines
3.6 KiB
Python
90 lines
3.6 KiB
Python
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
|
load("@rules_license//rules:license.bzl", "license")
|
|
|
|
package(
|
|
default_applicable_licenses = [":license"],
|
|
)
|
|
|
|
exports_files([
|
|
"LICENSE.MIT",
|
|
])
|
|
|
|
license(
|
|
name = "license",
|
|
license_kinds = ["@rules_license//licenses/spdx:MIT"],
|
|
license_text = "LICENSE.MIT",
|
|
)
|
|
|
|
cc_library(
|
|
name = "json",
|
|
hdrs = [
|
|
"include/nlohmann/adl_serializer.hpp",
|
|
"include/nlohmann/byte_container_with_subtype.hpp",
|
|
"include/nlohmann/detail/abi_macros.hpp",
|
|
"include/nlohmann/detail/bit_ops.hpp",
|
|
"include/nlohmann/detail/conversions/from_json.hpp",
|
|
"include/nlohmann/detail/conversions/to_chars.hpp",
|
|
"include/nlohmann/detail/conversions/to_json.hpp",
|
|
"include/nlohmann/detail/conversions/zmij.hpp",
|
|
"include/nlohmann/detail/exceptions.hpp",
|
|
"include/nlohmann/detail/hash.hpp",
|
|
"include/nlohmann/detail/input/binary_reader.hpp",
|
|
"include/nlohmann/detail/input/input_adapters.hpp",
|
|
"include/nlohmann/detail/input/json_sax.hpp",
|
|
"include/nlohmann/detail/input/lexer.hpp",
|
|
"include/nlohmann/detail/input/number_parse.hpp",
|
|
"include/nlohmann/detail/input/parser.hpp",
|
|
"include/nlohmann/detail/input/position_t.hpp",
|
|
"include/nlohmann/detail/input/pow5_table.hpp",
|
|
"include/nlohmann/detail/input/string_scan.hpp",
|
|
"include/nlohmann/detail/iterators/internal_iterator.hpp",
|
|
"include/nlohmann/detail/iterators/iter_impl.hpp",
|
|
"include/nlohmann/detail/iterators/iteration_proxy.hpp",
|
|
"include/nlohmann/detail/iterators/iterator_traits.hpp",
|
|
"include/nlohmann/detail/iterators/json_reverse_iterator.hpp",
|
|
"include/nlohmann/detail/iterators/primitive_iterator.hpp",
|
|
"include/nlohmann/detail/json_custom_base_class.hpp",
|
|
"include/nlohmann/detail/json_pointer.hpp",
|
|
"include/nlohmann/detail/json_ref.hpp",
|
|
"include/nlohmann/detail/macro_scope.hpp",
|
|
"include/nlohmann/detail/macro_unscope.hpp",
|
|
"include/nlohmann/detail/meta/call_std/begin.hpp",
|
|
"include/nlohmann/detail/meta/call_std/end.hpp",
|
|
"include/nlohmann/detail/meta/cpp_future.hpp",
|
|
"include/nlohmann/detail/meta/detected.hpp",
|
|
"include/nlohmann/detail/meta/identity_tag.hpp",
|
|
"include/nlohmann/detail/meta/is_sax.hpp",
|
|
"include/nlohmann/detail/meta/std_fs.hpp",
|
|
"include/nlohmann/detail/meta/type_traits.hpp",
|
|
"include/nlohmann/detail/meta/void_t.hpp",
|
|
"include/nlohmann/detail/output/binary_writer.hpp",
|
|
"include/nlohmann/detail/output/error_handler.hpp",
|
|
"include/nlohmann/detail/output/output_adapters.hpp",
|
|
"include/nlohmann/detail/output/serializer.hpp",
|
|
"include/nlohmann/detail/recursion_depth_limit.hpp",
|
|
"include/nlohmann/detail/string_concat.hpp",
|
|
"include/nlohmann/detail/string_escape.hpp",
|
|
"include/nlohmann/detail/string_utils.hpp",
|
|
"include/nlohmann/detail/value_t.hpp",
|
|
"include/nlohmann/json.hpp",
|
|
"include/nlohmann/json_fwd.hpp",
|
|
"include/nlohmann/json_literals.hpp",
|
|
"include/nlohmann/ordered_map.hpp",
|
|
"include/nlohmann/thirdparty/hedley/hedley.hpp",
|
|
"include/nlohmann/thirdparty/hedley/hedley_undef.hpp",
|
|
],
|
|
includes = ["include"],
|
|
visibility = ["//visibility:public"],
|
|
)
|
|
|
|
cc_library(
|
|
name = "singleheader-json",
|
|
hdrs = [
|
|
"single_include/nlohmann/json.hpp",
|
|
"single_include/nlohmann/json_fwd.hpp",
|
|
"single_include/nlohmann/json_literals.hpp",
|
|
],
|
|
includes = ["single_include"],
|
|
visibility = ["//visibility:public"],
|
|
)
|