mirror of
https://github.com/nlohmann/json.git
synced 2026-10-06 14:40:32 +00:00
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>
88 lines
3.5 KiB
Python
88 lines
3.5 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",
|
|
],
|
|
includes = ["single_include"],
|
|
visibility = ["//visibility:public"],
|
|
)
|