From a990de90fe41456a23e58bd087d2f107d321f3a1 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Fri, 19 Jul 2024 16:37:58 +0400 Subject: Deleted vendor folder --- vendor/ryu/.cargo-checksum.json | 1 - vendor/ryu/Cargo.lock | 149 ------- vendor/ryu/Cargo.toml | 55 --- vendor/ryu/LICENSE-APACHE | 176 -------- vendor/ryu/LICENSE-BOOST | 23 - vendor/ryu/README.md | 110 ----- vendor/ryu/benches/bench.rs | 62 --- vendor/ryu/examples/upstream_benchmark.rs | 85 ---- vendor/ryu/src/buffer/mod.rs | 171 -------- vendor/ryu/src/common.rs | 95 ---- vendor/ryu/src/d2s.rs | 300 ------------- vendor/ryu/src/d2s_full_table.rs | 696 ------------------------------ vendor/ryu/src/d2s_intrinsics.rs | 89 ---- vendor/ryu/src/d2s_small_table.rs | 142 ------ vendor/ryu/src/digit_table.rs | 28 -- vendor/ryu/src/f2s.rs | 176 -------- vendor/ryu/src/f2s_intrinsics.rs | 113 ----- vendor/ryu/src/lib.rs | 124 ------ vendor/ryu/src/parse.rs | 19 - vendor/ryu/src/pretty/exponent.rs | 48 --- vendor/ryu/src/pretty/mantissa.rs | 82 ---- vendor/ryu/src/pretty/mod.rs | 224 ---------- vendor/ryu/src/s2d.rs | 217 ---------- vendor/ryu/src/s2f.rs | 227 ---------- vendor/ryu/tests/common_test.rs | 91 ---- vendor/ryu/tests/d2s_intrinsics_test.rs | 72 ---- vendor/ryu/tests/d2s_table_test.rs | 59 --- vendor/ryu/tests/d2s_test.rs | 331 -------------- vendor/ryu/tests/exhaustive.rs | 52 --- vendor/ryu/tests/f2s_test.rs | 181 -------- vendor/ryu/tests/macros/mod.rs | 8 - vendor/ryu/tests/s2d_test.rs | 167 ------- vendor/ryu/tests/s2f_test.rs | 110 ----- 33 files changed, 4483 deletions(-) delete mode 100644 vendor/ryu/.cargo-checksum.json delete mode 100644 vendor/ryu/Cargo.lock delete mode 100644 vendor/ryu/Cargo.toml delete mode 100644 vendor/ryu/LICENSE-APACHE delete mode 100644 vendor/ryu/LICENSE-BOOST delete mode 100644 vendor/ryu/README.md delete mode 100644 vendor/ryu/benches/bench.rs delete mode 100644 vendor/ryu/examples/upstream_benchmark.rs delete mode 100644 vendor/ryu/src/buffer/mod.rs delete mode 100644 vendor/ryu/src/common.rs delete mode 100644 vendor/ryu/src/d2s.rs delete mode 100644 vendor/ryu/src/d2s_full_table.rs delete mode 100644 vendor/ryu/src/d2s_intrinsics.rs delete mode 100644 vendor/ryu/src/d2s_small_table.rs delete mode 100644 vendor/ryu/src/digit_table.rs delete mode 100644 vendor/ryu/src/f2s.rs delete mode 100644 vendor/ryu/src/f2s_intrinsics.rs delete mode 100644 vendor/ryu/src/lib.rs delete mode 100644 vendor/ryu/src/parse.rs delete mode 100644 vendor/ryu/src/pretty/exponent.rs delete mode 100644 vendor/ryu/src/pretty/mantissa.rs delete mode 100644 vendor/ryu/src/pretty/mod.rs delete mode 100644 vendor/ryu/src/s2d.rs delete mode 100644 vendor/ryu/src/s2f.rs delete mode 100644 vendor/ryu/tests/common_test.rs delete mode 100644 vendor/ryu/tests/d2s_intrinsics_test.rs delete mode 100644 vendor/ryu/tests/d2s_table_test.rs delete mode 100644 vendor/ryu/tests/d2s_test.rs delete mode 100644 vendor/ryu/tests/exhaustive.rs delete mode 100644 vendor/ryu/tests/f2s_test.rs delete mode 100644 vendor/ryu/tests/macros/mod.rs delete mode 100644 vendor/ryu/tests/s2d_test.rs delete mode 100644 vendor/ryu/tests/s2f_test.rs (limited to 'vendor/ryu') diff --git a/vendor/ryu/.cargo-checksum.json b/vendor/ryu/.cargo-checksum.json deleted file mode 100644 index e64ba5b..0000000 --- a/vendor/ryu/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"Cargo.lock":"bf05f9d2882172d0ced848ce2e28631c055b2102c2db2243aa7d4d4507624a9d","Cargo.toml":"c1299fe790cd356421da83744cf7a3c87285ae8b957af4ac8303b08b632ce11a","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-BOOST":"c9bff75738922193e67fa726fa225535870d2aa1059f91452c411736284ad566","README.md":"86f0a92cf076f4983f99926607ea272c9650a5996fa3921fc5ca5abceb0f18db","benches/bench.rs":"703521c8cb9c6959ee305776a9971d24754b6fff5c1737741be04f956a3692e8","examples/upstream_benchmark.rs":"f702d3598a8fac59134a8058ebf74ba90163b1f23ebbd6c5978a7bd8a888d357","src/buffer/mod.rs":"e32f3fa7e994ff704796e58e115c5258e94a79a184d1608864772f2f2f5274fc","src/common.rs":"cae347e97fc30c50a964f80425e8c3e69ece2b8ab81f9b81b9baa7fcec64a001","src/d2s.rs":"83f821f17fd8d2cf72bcc47cc8c603ab24f2377db6cd0f08638031716f8dc17c","src/d2s_full_table.rs":"9b0186acbc6d65dc55c17e16125be707a2bfb920d22b35d33234b4cc38566a36","src/d2s_intrinsics.rs":"bbf15472f4299942312e80a992cbc2f47f85f17ed193f24084534434dbfb26e7","src/d2s_small_table.rs":"7b25cfbf0793d0662d83f5d92a9f880295652db9979b5acf702b313359996508","src/digit_table.rs":"02351ca54cb8cb3679f635115dd094f32fd91750e9f66103c1ee9ec3db507072","src/f2s.rs":"55320c2301680d8be3a908620cccd9d103b0cd3ad7a7d3378589e274ffc2587b","src/f2s_intrinsics.rs":"97bab98093838e30c60f5135f54f5ccb039ff7d9f35553ac8e74437743ca47e2","src/lib.rs":"560602c3cca66958b710f788aa4415b3de67293db3c41cb0b5083b59eac28c5b","src/parse.rs":"7f8aa7e007caf5dcb03abdc4238157724bb742d0823a3b8a01646fa1f1129154","src/pretty/exponent.rs":"6c9aa1c707c567ae338647056e37557a94e5120781ee9f6f64e9c7071ffb50d0","src/pretty/mantissa.rs":"5e8d0a6bfdfd04e599a9fc8aefd638e3288651279e870e7cd44820717c3b6438","src/pretty/mod.rs":"731798246d414ca54df739c212f1cb8e05991a0472a7a1c28771e24d7a1cf09b","src/s2d.rs":"2f572603eedaa9efbe864105999a1ceac8aa4ff4e1d2fbd96127692460194d16","src/s2f.rs":"6ae7430fba61f59aa6010d446f5c1043974b6fadb8e4c75ce2ad56f73ee48f4a","tests/common_test.rs":"275184cf366f80c11e5f33c2d53065a073e20d81bf71ca70478c89e47fb8da36","tests/d2s_intrinsics_test.rs":"15d11b70810bf04f33f8b185bf7f010a436a4edb47fa4648b1a036568c2c5d15","tests/d2s_table_test.rs":"54b3a7d40aa9bec03e9dc555d15fb4512ee16a16398b3098a97819fab50c81f3","tests/d2s_test.rs":"d72aaf37c76a4042ecc12b7d6faf844696016bb72bb20d142ecab3bd6c87e29f","tests/exhaustive.rs":"f475ed9008a2cd86ce95abb577a4b01e9fed23fc16f7e217ccffb3b834005fa0","tests/f2s_test.rs":"ad9e6fe46e712c488b876428c144c79bdff0349b41c57eee5506fc3c9c156624","tests/macros/mod.rs":"8e90a674b3960f9516cb38f4eea0e0981ff902c3b33572ebdb6c5528d3ffa72c","tests/s2d_test.rs":"75c3a1044881718db65e05f25c9f6e1d005392dddb2e8dafb799668bb6a9a5c3","tests/s2f_test.rs":"1ec06646cb65229bfe866ec913901a0d8d736668f30b812fc4b00136a43f5142"},"package":"f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"} \ No newline at end of file diff --git a/vendor/ryu/Cargo.lock b/vendor/ryu/Cargo.lock deleted file mode 100644 index c52a439..0000000 --- a/vendor/ryu/Cargo.lock +++ /dev/null @@ -1,149 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "libc" -version = "0.2.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" - -[[package]] -name = "no-panic" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71a6d126424f5ce0bb4587ff4561421d44aeede520541cc66f1bb912506ae46a" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "ryu" -version = "1.0.16" -dependencies = [ - "no-panic", - "num_cpus", - "rand", - "rand_xorshift", -] - -[[package]] -name = "syn" -version = "2.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/vendor/ryu/Cargo.toml b/vendor/ryu/Cargo.toml deleted file mode 100644 index a5c87c3..0000000 --- a/vendor/ryu/Cargo.toml +++ /dev/null @@ -1,55 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies. -# -# If you are reading this file be aware that the original Cargo.toml -# will likely look very different (and much more reasonable). -# See Cargo.toml.orig for the original contents. - -[package] -edition = "2018" -rust-version = "1.36" -name = "ryu" -version = "1.0.16" -authors = ["David Tolnay "] -exclude = [ - "performance.png", - "chart/**", -] -description = "Fast floating point to string conversion" -documentation = "https://docs.rs/ryu" -readme = "README.md" -keywords = ["float"] -categories = [ - "value-formatting", - "no-std", - "no-std::no-alloc", -] -license = "Apache-2.0 OR BSL-1.0" -repository = "https://github.com/dtolnay/ryu" - -[package.metadata.docs.rs] -rustdoc-args = ["--generate-link-to-definition"] -targets = ["x86_64-unknown-linux-gnu"] - -[lib] -doc-scrape-examples = false - -[dependencies.no-panic] -version = "0.1" -optional = true - -[dev-dependencies.num_cpus] -version = "1.8" - -[dev-dependencies.rand] -version = "0.8" - -[dev-dependencies.rand_xorshift] -version = "0.3" - -[features] -small = [] diff --git a/vendor/ryu/LICENSE-APACHE b/vendor/ryu/LICENSE-APACHE deleted file mode 100644 index 1b5ec8b..0000000 --- a/vendor/ryu/LICENSE-APACHE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/vendor/ryu/LICENSE-BOOST b/vendor/ryu/LICENSE-BOOST deleted file mode 100644 index 36b7cd9..0000000 --- a/vendor/ryu/LICENSE-BOOST +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/vendor/ryu/README.md b/vendor/ryu/README.md deleted file mode 100644 index 998ea3e..0000000 --- a/vendor/ryu/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# Ryū - -[github](https://github.com/dtolnay/ryu) -[crates.io](https://crates.io/crates/ryu) -[docs.rs](https://docs.rs/ryu) -[build status](https://github.com/dtolnay/ryu/actions?query=branch%3Amaster) - -Pure Rust implementation of Ryū, an algorithm to quickly convert floating point -numbers to decimal strings. - -The PLDI'18 paper [*Ryū: fast float-to-string conversion*][paper] by Ulf Adams -includes a complete correctness proof of the algorithm. The paper is available -under the creative commons CC-BY-SA license. - -This Rust implementation is a line-by-line port of Ulf Adams' implementation in -C, [https://github.com/ulfjack/ryu][upstream]. - -*Requirements: this crate supports any compiler version back to rustc 1.36; it -uses nothing from the Rust standard library so is usable from no_std crates.* - -[paper]: https://dl.acm.org/citation.cfm?id=3192369 -[upstream]: https://github.com/ulfjack/ryu/tree/77e767f5e056bab96e895072fc21618ecff2f44b - -```toml -[dependencies] -ryu = "1.0" -``` - -
- -## Example - -```rust -fn main() { - let mut buffer = ryu::Buffer::new(); - let printed = buffer.format(1.234); - assert_eq!(printed, "1.234"); -} -``` - -
- -## Performance (lower is better) - -![performance](https://raw.githubusercontent.com/dtolnay/ryu/master/performance.png) - -You can run upstream's benchmarks with: - -```console -$ git clone https://github.com/ulfjack/ryu c-ryu -$ cd c-ryu -$ bazel run -c opt //ryu/benchmark:ryu_benchmark -``` - -And the same benchmark against our implementation with: - -```console -$ git clone https://github.com/dtolnay/ryu rust-ryu -$ cd rust-ryu -$ cargo run --example upstream_benchmark --release -``` - -These benchmarks measure the average time to print a 32-bit float and average -time to print a 64-bit float, where the inputs are distributed as uniform random -bit patterns 32 and 64 bits wide. - -The upstream C code, the unsafe direct Rust port, and the safe pretty Rust API -all perform the same, taking around 21 nanoseconds to format a 32-bit float and -31 nanoseconds to format a 64-bit float. - -There is also a Rust-specific benchmark comparing this implementation to the -standard library which you can run with: - -```console -$ cargo bench -``` - -The benchmark shows Ryū approximately 2-5x faster than the standard library -across a range of f32 and f64 inputs. Measurements are in nanoseconds per -iteration; smaller is better. - -## Formatting - -This library tends to produce more human-readable output than the standard -library's to\_string, which never uses scientific notation. Here are two -examples: - -- *ryu:* 1.23e40, *std:* 12300000000000000000000000000000000000000 -- *ryu:* 1.23e-40, *std:* 0.000000000000000000000000000000000000000123 - -Both libraries print short decimals such as 0.0000123 without scientific -notation. - -
- -#### License - - -Licensed under either of Apache License, Version -2.0 or Boost Software License 1.0 at your -option. - - -
- - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in this crate by you, as defined in the Apache-2.0 license, shall -be dual licensed as above, without any additional terms or conditions. - diff --git a/vendor/ryu/benches/bench.rs b/vendor/ryu/benches/bench.rs deleted file mode 100644 index fbc1b70..0000000 --- a/vendor/ryu/benches/bench.rs +++ /dev/null @@ -1,62 +0,0 @@ -// cargo bench - -#![feature(test)] -#![allow( - clippy::approx_constant, - clippy::excessive_precision, - clippy::unreadable_literal -)] - -extern crate test; - -use std::io::Write; -use std::{f32, f64}; -use test::{black_box, Bencher}; - -macro_rules! benches { - ($($name:ident($value:expr),)*) => { - mod bench_ryu { - use super::*; - $( - #[bench] - fn $name(b: &mut Bencher) { - let mut buf = ryu::Buffer::new(); - - b.iter(move || { - let value = black_box($value); - let formatted = buf.format_finite(value); - black_box(formatted); - }); - } - )* - } - - mod bench_std_fmt { - use super::*; - $( - #[bench] - fn $name(b: &mut Bencher) { - let mut buf = Vec::with_capacity(20); - - b.iter(|| { - buf.clear(); - let value = black_box($value); - write!(&mut buf, "{}", value).unwrap(); - black_box(buf.as_slice()); - }); - } - )* - } - }; -} - -benches! { - bench_0_f64(0f64), - bench_short_f64(0.1234f64), - bench_e_f64(2.718281828459045f64), - bench_max_f64(f64::MAX), - bench_0_f32(0f32), - bench_short_f32(0.1234f32), - bench_e_f32(2.718281828459045f32), - bench_max_f32(f32::MAX), -} diff --git a/vendor/ryu/examples/upstream_benchmark.rs b/vendor/ryu/examples/upstream_benchmark.rs deleted file mode 100644 index 437855b..0000000 --- a/vendor/ryu/examples/upstream_benchmark.rs +++ /dev/null @@ -1,85 +0,0 @@ -// cargo run --example upstream_benchmark --release - -use rand::{Rng, SeedableRng}; - -const SAMPLES: usize = 10000; -const ITERATIONS: usize = 1000; - -struct MeanAndVariance { - n: i64, - mean: f64, - m2: f64, -} - -impl MeanAndVariance { - fn new() -> Self { - MeanAndVariance { - n: 0, - mean: 0.0, - m2: 0.0, - } - } - - fn update(&mut self, x: f64) { - self.n += 1; - let d = x - self.mean; - self.mean += d / self.n as f64; - let d2 = x - self.mean; - self.m2 += d * d2; - } - - fn variance(&self) -> f64 { - self.m2 / (self.n - 1) as f64 - } - - fn stddev(&self) -> f64 { - self.variance().sqrt() - } -} - -macro_rules! benchmark { - ($name:ident, $ty:ident) => { - fn $name() -> usize { - let mut rng = rand_xorshift::XorShiftRng::from_seed([123u8; 16]); - let mut mv = MeanAndVariance::new(); - let mut throwaway = 0; - for _ in 0..SAMPLES { - let f = loop { - let f = $ty::from_bits(rng.gen()); - if f.is_finite() { - break f; - } - }; - - let t1 = std::time::SystemTime::now(); - for _ in 0..ITERATIONS { - throwaway += ryu::Buffer::new().format_finite(f).len(); - } - let duration = t1.elapsed().unwrap(); - let nanos = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64; - mv.update(nanos as f64 / ITERATIONS as f64); - } - println!( - "{:12} {:8.3} {:8.3}", - concat!(stringify!($name), ":"), - mv.mean, - mv.stddev(), - ); - throwaway - } - }; -} - -benchmark!(pretty32, f32); -benchmark!(pretty64, f64); - -fn main() { - println!("{:>20}{:>9}", "Average", "Stddev"); - let mut throwaway = 0; - throwaway += pretty32(); - throwaway += pretty64(); - if std::env::var_os("ryu-benchmark").is_some() { - // Prevent the compiler from optimizing the code away. - println!("{}", throwaway); - } -} diff --git a/vendor/ryu/src/buffer/mod.rs b/vendor/ryu/src/buffer/mod.rs deleted file mode 100644 index 905ee2f..0000000 --- a/vendor/ryu/src/buffer/mod.rs +++ /dev/null @@ -1,171 +0,0 @@ -use crate::raw; -use core::mem::MaybeUninit; -use core::{slice, str}; -#[cfg(feature = "no-panic")] -use no_panic::no_panic; - -const NAN: &str = "NaN"; -const INFINITY: &str = "inf"; -const NEG_INFINITY: &str = "-inf"; - -/// Safe API for formatting floating point numbers to text. -/// -/// ## Example -/// -/// ``` -/// let mut buffer = ryu::Buffer::new(); -/// let printed = buffer.format_finite(1.234); -/// assert_eq!(printed, "1.234"); -/// ``` -pub struct Buffer { - bytes: [MaybeUninit; 24], -} - -impl Buffer { - /// This is a cheap operation; you don't need to worry about reusing buffers - /// for efficiency. - #[inline] - #[cfg_attr(feature = "no-panic", no_panic)] - pub fn new() -> Self { - let bytes = [MaybeUninit::::uninit(); 24]; - Buffer { bytes } - } - - /// Print a floating point number into this buffer and return a reference to - /// its string representation within the buffer. - /// - /// # Special cases - /// - /// This function formats NaN as the string "NaN", positive infinity as - /// "inf", and negative infinity as "-inf" to match std::fmt. - /// - /// If your input is known to be finite, you may get better performance by - /// calling the `format_finite` method instead of `format` to avoid the - /// checks for special cases. - #[cfg_attr(feature = "no-panic", inline)] - #[cfg_attr(feature = "no-panic", no_panic)] - pub fn format(&mut self, f: F) -> &str { - if f.is_nonfinite() { - f.format_nonfinite() - } else { - self.format_finite(f) - } - } - - /// Print a floating point number into this buffer and return a reference to - /// its string representation within the buffer. - /// - /// # Special cases - /// - /// This function **does not** check for NaN or infinity. If the input - /// number is not a finite float, the printed representation will be some - /// correctly formatted but unspecified numerical value. - /// - /// Please check [`is_finite`] yourself before calling this function, or - /// check [`is_nan`] and [`is_infinite`] and handle those cases yourself. - /// - /// [`is_finite`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_finite - /// [`is_nan`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_nan - /// [`is_infinite`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_infinite - #[inline] - #[cfg_attr(feature = "no-panic", no_panic)] - pub fn format_finite(&mut self, f: F) -> &str { - unsafe { - let n = f.write_to_ryu_buffer(self.bytes.as_mut_ptr() as *mut u8); - debug_assert!(n <= self.bytes.len()); - let slice = slice::from_raw_parts(self.bytes.as_ptr() as *const u8, n); - str::from_utf8_unchecked(slice) - } - } -} - -impl Copy for Buffer {} - -impl Clone for Buffer { - #[inline] - #[allow(clippy::non_canonical_clone_impl)] // false positive https://github.com/rust-lang/rust-clippy/issues/11072 - fn clone(&self) -> Self { - Buffer::new() - } -} - -impl Default for Buffer { - #[inline] - #[cfg_attr(feature = "no-panic", no_panic)] - fn default() -> Self { - Buffer::new() - } -} - -/// A floating point number, f32 or f64, that can be written into a -/// [`ryu::Buffer`][Buffer]. -/// -/// This trait is sealed and cannot be implemented for types outside of the -/// `ryu` crate. -pub trait Float: Sealed {} -impl Float for f32 {} -impl Float for f64 {} - -pub trait Sealed: Copy { - fn is_nonfinite(self) -> bool; - fn format_nonfinite(self) -> &'static str; - unsafe fn write_to_ryu_buffer(self, result: *mut u8) -> usize; -} - -impl Sealed for f32 { - #[inline] - fn is_nonfinite(self) -> bool { - const EXP_MASK: u32 = 0x7f800000; - let bits = self.to_bits(); - bits & EXP_MASK == EXP_MASK - } - - #[cold] - #[cfg_attr(feature = "no-panic", inline)] - fn format_nonfinite(self) -> &'static str { - const MANTISSA_MASK: u32 = 0x007fffff; - const SIGN_MASK: u32 = 0x80000000; - let bits = self.to_bits(); - if bits & MANTISSA_MASK != 0 { - NAN - } else if bits & SIGN_MASK != 0 { - NEG_INFINITY - } else { - INFINITY - } - } - - #[inline] - unsafe fn write_to_ryu_buffer(self, result: *mut u8) -> usize { - raw::format32(self, result) - } -} - -impl Sealed for f64 { - #[inline] - fn is_nonfinite(self) -> bool { - const EXP_MASK: u64 = 0x7ff0000000000000; - let bits = self.to_bits(); - bits & EXP_MASK == EXP_MASK - } - - #[cold] - #[cfg_attr(feature = "no-panic", inline)] - fn format_nonfinite(self) -> &'static str { - const MANTISSA_MASK: u64 = 0x000fffffffffffff; - const SIGN_MASK: u64 = 0x8000000000000000; - let bits = self.to_bits(); - if bits & MANTISSA_MASK != 0 { - NAN - } else if bits & SIGN_MASK != 0 { - NEG_INFINITY - } else { - INFINITY - } - } - - #[inline] - unsafe fn write_to_ryu_buffer(self, result: *mut u8) -> usize { - raw::format64(self, result) - } -} diff --git a/vendor/ryu/src/common.rs b/vendor/ryu/src/common.rs deleted file mode 100644 index 9613036..0000000 --- a/vendor/ryu/src/common.rs +++ /dev/null @@ -1,95 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -// Returns the number of decimal digits in v, which must not contain more than 9 -// digits. -#[cfg_attr(feature = "no-panic", inline)] -pub fn decimal_length9(v: u32) -> u32 { - // Function precondition: v is not a 10-digit number. - // (f2s: 9 digits are sufficient for round-tripping.) - debug_assert!(v < 1000000000); - - if v >= 100000000 { - 9 - } else if v >= 10000000 { - 8 - } else if v >= 1000000 { - 7 - } else if v >= 100000 { - 6 - } else if v >= 10000 { - 5 - } else if v >= 1000 { - 4 - } else if v >= 100 { - 3 - } else if v >= 10 { - 2 - } else { - 1 - } -} - -// Returns e == 0 ? 1 : [log_2(5^e)]; requires 0 <= e <= 3528. -#[cfg_attr(feature = "no-panic", inline)] -#[allow(dead_code)] -pub fn log2_pow5(e: i32) -> i32 /* or u32 -> u32 */ { - // This approximation works up to the point that the multiplication - // overflows at e = 3529. If the multiplication were done in 64 bits, it - // would fail at 5^4004 which is just greater than 2^9297. - debug_assert!(e >= 0); - debug_assert!(e <= 3528); - ((e as u32 * 1217359) >> 19) as i32 -} - -// Returns e == 0 ? 1 : ceil(log_2(5^e)); requires 0 <= e <= 3528. -#[cfg_attr(feature = "no-panic", inline)] -pub fn pow5bits(e: i32) -> i32 /* or u32 -> u32 */ { - // This approximation works up to the point that the multiplication - // overflows at e = 3529. If the multiplication were done in 64 bits, it - // would fail at 5^4004 which is just greater than 2^9297. - debug_assert!(e >= 0); - debug_assert!(e <= 3528); - (((e as u32 * 1217359) >> 19) + 1) as i32 -} - -#[cfg_attr(feature = "no-panic", inline)] -#[allow(dead_code)] -pub fn ceil_log2_pow5(e: i32) -> i32 /* or u32 -> u32 */ { - log2_pow5(e) + 1 -} - -// Returns floor(log_10(2^e)); requires 0 <= e <= 1650. -#[cfg_attr(feature = "no-panic", inline)] -pub fn log10_pow2(e: i32) -> u32 /* or u32 -> u32 */ { - // The first value this approximation fails for is 2^1651 which is just greater than 10^297. - debug_assert!(e >= 0); - debug_assert!(e <= 1650); - (e as u32 * 78913) >> 18 -} - -// Returns floor(log_10(5^e)); requires 0 <= e <= 2620. -#[cfg_attr(feature = "no-panic", inline)] -pub fn log10_pow5(e: i32) -> u32 /* or u32 -> u32 */ { - // The first value this approximation fails for is 5^2621 which is just greater than 10^1832. - debug_assert!(e >= 0); - debug_assert!(e <= 2620); - (e as u32 * 732923) >> 20 -} diff --git a/vendor/ryu/src/d2s.rs b/vendor/ryu/src/d2s.rs deleted file mode 100644 index 392577a..0000000 --- a/vendor/ryu/src/d2s.rs +++ /dev/null @@ -1,300 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -use crate::common::*; -#[cfg(not(feature = "small"))] -pub use crate::d2s_full_table::*; -use crate::d2s_intrinsics::*; -#[cfg(feature = "small")] -pub use crate::d2s_small_table::*; -use core::mem::MaybeUninit; - -pub const DOUBLE_MANTISSA_BITS: u32 = 52; -pub const DOUBLE_EXPONENT_BITS: u32 = 11; -pub const DOUBLE_BIAS: i32 = 1023; -pub const DOUBLE_POW5_INV_BITCOUNT: i32 = 125; -pub const DOUBLE_POW5_BITCOUNT: i32 = 125; - -#[cfg_attr(feature = "no-panic", inline)] -pub fn decimal_length17(v: u64) -> u32 { - // This is slightly faster than a loop. - // The average output length is 16.38 digits, so we check high-to-low. - // Function precondition: v is not an 18, 19, or 20-digit number. - // (17 digits are sufficient for round-tripping.) - debug_assert!(v < 100000000000000000); - - if v >= 10000000000000000 { - 17 - } else if v >= 1000000000000000 { - 16 - } else if v >= 100000000000000 { - 15 - } else if v >= 10000000000000 { - 14 - } else if v >= 1000000000000 { - 13 - } else if v >= 100000000000 { - 12 - } else if v >= 10000000000 { - 11 - } else if v >= 1000000000 { - 10 - } else if v >= 100000000 { - 9 - } else if v >= 10000000 { - 8 - } else if v >= 1000000 { - 7 - } else if v >= 100000 { - 6 - } else if v >= 10000 { - 5 - } else if v >= 1000 { - 4 - } else if v >= 100 { - 3 - } else if v >= 10 { - 2 - } else { - 1 - } -} - -// A floating decimal representing m * 10^e. -pub struct FloatingDecimal64 { - pub mantissa: u64, - // Decimal exponent's range is -324 to 308 - // inclusive, and can fit in i16 if needed. - pub exponent: i32, -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn d2d(ieee_mantissa: u64, ieee_exponent: u32) -> FloatingDecimal64 { - let (e2, m2) = if ieee_exponent == 0 { - ( - // We subtract 2 so that the bounds computation has 2 additional bits. - 1 - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS as i32 - 2, - ieee_mantissa, - ) - } else { - ( - ieee_exponent as i32 - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS as i32 - 2, - (1u64 << DOUBLE_MANTISSA_BITS) | ieee_mantissa, - ) - }; - let even = (m2 & 1) == 0; - let accept_bounds = even; - - // Step 2: Determine the interval of valid decimal representations. - let mv = 4 * m2; - // Implicit bool -> int conversion. True is 1, false is 0. - let mm_shift = (ieee_mantissa != 0 || ieee_exponent <= 1) as u32; - // We would compute mp and mm like this: - // uint64_t mp = 4 * m2 + 2; - // uint64_t mm = mv - 1 - mm_shift; - - // Step 3: Convert to a decimal power base using 128-bit arithmetic. - let mut vr: u64; - let mut vp: u64; - let mut vm: u64; - let mut vp_uninit: MaybeUninit = MaybeUninit::uninit(); - let mut vm_uninit: MaybeUninit = MaybeUninit::uninit(); - let e10: i32; - let mut vm_is_trailing_zeros = false; - let mut vr_is_trailing_zeros = false; - if e2 >= 0 { - // I tried special-casing q == 0, but there was no effect on performance. - // This expression is slightly faster than max(0, log10_pow2(e2) - 1). - let q = log10_pow2(e2) - (e2 > 3) as u32; - e10 = q as i32; - let k = DOUBLE_POW5_INV_BITCOUNT + pow5bits(q as i32) - 1; - let i = -e2 + q as i32 + k; - vr = unsafe { - mul_shift_all_64( - m2, - #[cfg(feature = "small")] - &compute_inv_pow5(q), - #[cfg(not(feature = "small"))] - { - debug_assert!(q < DOUBLE_POW5_INV_SPLIT.len() as u32); - DOUBLE_POW5_INV_SPLIT.get_unchecked(q as usize) - }, - i as u32, - vp_uninit.as_mut_ptr(), - vm_uninit.as_mut_ptr(), - mm_shift, - ) - }; - vp = unsafe { vp_uninit.assume_init() }; - vm = unsafe { vm_uninit.assume_init() }; - if q <= 21 { - // This should use q <= 22, but I think 21 is also safe. Smaller values - // may still be safe, but it's more difficult to reason about them. - // Only one of mp, mv, and mm can be a multiple of 5, if any. - let mv_mod5 = (mv as u32).wrapping_sub(5u32.wrapping_mul(div5(mv) as u32)); - if mv_mod5 == 0 { - vr_is_trailing_zeros = multiple_of_power_of_5(mv, q); - } else if accept_bounds { - // Same as min(e2 + (~mm & 1), pow5_factor(mm)) >= q - // <=> e2 + (~mm & 1) >= q && pow5_factor(mm) >= q - // <=> true && pow5_factor(mm) >= q, since e2 >= q. - vm_is_trailing_zeros = multiple_of_power_of_5(mv - 1 - mm_shift as u64, q); - } else { - // Same as min(e2 + 1, pow5_factor(mp)) >= q. - vp -= multiple_of_power_of_5(mv + 2, q) as u64; - } - } - } else { - // This expression is slightly faster than max(0, log10_pow5(-e2) - 1). - let q = log10_pow5(-e2) - (-e2 > 1) as u32; - e10 = q as i32 + e2; - let i = -e2 - q as i32; - let k = pow5bits(i) - DOUBLE_POW5_BITCOUNT; - let j = q as i32 - k; - vr = unsafe { - mul_shift_all_64( - m2, - #[cfg(feature = "small")] - &compute_pow5(i as u32), - #[cfg(not(feature = "small"))] - { - debug_assert!(i < DOUBLE_POW5_SPLIT.len() as i32); - DOUBLE_POW5_SPLIT.get_unchecked(i as usize) - }, - j as u32, - vp_uninit.as_mut_ptr(), - vm_uninit.as_mut_ptr(), - mm_shift, - ) - }; - vp = unsafe { vp_uninit.assume_init() }; - vm = unsafe { vm_uninit.assume_init() }; - if q <= 1 { - // {vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q trailing 0 bits. - // mv = 4 * m2, so it always has at least two trailing 0 bits. - vr_is_trailing_zeros = true; - if accept_bounds { - // mm = mv - 1 - mm_shift, so it has 1 trailing 0 bit iff mm_shift == 1. - vm_is_trailing_zeros = mm_shift == 1; - } else { - // mp = mv + 2, so it always has at least one trailing 0 bit. - vp -= 1; - } - } else if q < 63 { - // TODO(ulfjack): Use a tighter bound here. - // We want to know if the full product has at least q trailing zeros. - // We need to compute min(p2(mv), p5(mv) - e2) >= q - // <=> p2(mv) >= q && p5(mv) - e2 >= q - // <=> p2(mv) >= q (because -e2 >= q) - vr_is_trailing_zeros = multiple_of_power_of_2(mv, q); - } - } - - // Step 4: Find the shortest decimal representation in the interval of valid representations. - let mut removed = 0i32; - let mut last_removed_digit = 0u8; - // On average, we remove ~2 digits. - let output = if vm_is_trailing_zeros || vr_is_trailing_zeros { - // General case, which happens rarely (~0.7%). - loop { - let vp_div10 = div10(vp); - let vm_div10 = div10(vm); - if vp_div10 <= vm_div10 { - break; - } - let vm_mod10 = (vm as u32).wrapping_sub(10u32.wrapping_mul(vm_div10 as u32)); - let vr_div10 = div10(vr); - let vr_mod10 = (vr as u32).wrapping_sub(10u32.wrapping_mul(vr_div10 as u32)); - vm_is_trailing_zeros &= vm_mod10 == 0; - vr_is_trailing_zeros &= last_removed_digit == 0; - last_removed_digit = vr_mod10 as u8; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - if vm_is_trailing_zeros { - loop { - let vm_div10 = div10(vm); - let vm_mod10 = (vm as u32).wrapping_sub(10u32.wrapping_mul(vm_div10 as u32)); - if vm_mod10 != 0 { - break; - } - let vp_div10 = div10(vp); - let vr_div10 = div10(vr); - let vr_mod10 = (vr as u32).wrapping_sub(10u32.wrapping_mul(vr_div10 as u32)); - vr_is_trailing_zeros &= last_removed_digit == 0; - last_removed_digit = vr_mod10 as u8; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - } - if vr_is_trailing_zeros && last_removed_digit == 5 && vr % 2 == 0 { - // Round even if the exact number is .....50..0. - last_removed_digit = 4; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - vr + ((vr == vm && (!accept_bounds || !vm_is_trailing_zeros)) || last_removed_digit >= 5) - as u64 - } else { - // Specialized for the common case (~99.3%). Percentages below are relative to this. - let mut round_up = false; - let vp_div100 = div100(vp); - let vm_div100 = div100(vm); - // Optimization: remove two digits at a time (~86.2%). - if vp_div100 > vm_div100 { - let vr_div100 = div100(vr); - let vr_mod100 = (vr as u32).wrapping_sub(100u32.wrapping_mul(vr_div100 as u32)); - round_up = vr_mod100 >= 50; - vr = vr_div100; - vp = vp_div100; - vm = vm_div100; - removed += 2; - } - // Loop iterations below (approximately), without optimization above: - // 0: 0.03%, 1: 13.8%, 2: 70.6%, 3: 14.0%, 4: 1.40%, 5: 0.14%, 6+: 0.02% - // Loop iterations below (approximately), with optimization above: - // 0: 70.6%, 1: 27.8%, 2: 1.40%, 3: 0.14%, 4+: 0.02% - loop { - let vp_div10 = div10(vp); - let vm_div10 = div10(vm); - if vp_div10 <= vm_div10 { - break; - } - let vr_div10 = div10(vr); - let vr_mod10 = (vr as u32).wrapping_sub(10u32.wrapping_mul(vr_div10 as u32)); - round_up = vr_mod10 >= 5; - vr = vr_div10; - vp = vp_div10; - vm = vm_div10; - removed += 1; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - vr + (vr == vm || round_up) as u64 - }; - let exp = e10 + removed; - - FloatingDecimal64 { - exponent: exp, - mantissa: output, - } -} diff --git a/vendor/ryu/src/d2s_full_table.rs b/vendor/ryu/src/d2s_full_table.rs deleted file mode 100644 index 7534ddd..0000000 --- a/vendor/ryu/src/d2s_full_table.rs +++ /dev/null @@ -1,696 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -const DOUBLE_POW5_INV_TABLE_SIZE: usize = 342; -const DOUBLE_POW5_TABLE_SIZE: usize = 326; - -pub static DOUBLE_POW5_INV_SPLIT: [(u64, u64); DOUBLE_POW5_INV_TABLE_SIZE] = [ - (1, 2305843009213693952), - (11068046444225730970, 1844674407370955161), - (5165088340638674453, 1475739525896764129), - (7821419487252849886, 1180591620717411303), - (8824922364862649494, 1888946593147858085), - (7059937891890119595, 1511157274518286468), - (13026647942995916322, 1208925819614629174), - (9774590264567735146, 1934281311383406679), - (11509021026396098440, 1547425049106725343), - (16585914450600699399, 1237940039285380274), - (15469416676735388068, 1980704062856608439), - (16064882156130220778, 1584563250285286751), - (9162556910162266299, 1267650600228229401), - (7281393426775805432, 2028240960365167042), - (16893161185646375315, 1622592768292133633), - (2446482504291369283, 1298074214633706907), - (7603720821608101175, 2076918743413931051), - (2393627842544570617, 1661534994731144841), - (16672297533003297786, 1329227995784915872), - (11918280793837635165, 2126764793255865396), - (5845275820328197809, 1701411834604692317), - (15744267100488289217, 1361129467683753853), - (3054734472329800808, 2177807148294006166), - (17201182836831481939, 1742245718635204932), - (6382248639981364905, 1393796574908163946), - (2832900194486363201, 2230074519853062314), - (5955668970331000884, 1784059615882449851), - (1075186361522890384, 1427247692705959881), - (12788344622662355584, 2283596308329535809), - (13920024512871794791, 1826877046663628647), - (3757321980813615186, 1461501637330902918), - (10384555214134712795, 1169201309864722334), - (5547241898389809503, 1870722095783555735), - (4437793518711847602, 1496577676626844588), - (10928932444453298728, 1197262141301475670), - (17486291911125277965, 1915619426082361072), - (6610335899416401726, 1532495540865888858), - (12666966349016942027, 1225996432692711086), - (12888448528943286597, 1961594292308337738), - (17689456452638449924, 1569275433846670190), - (14151565162110759939, 1255420347077336152), - (7885109000409574610, 2008672555323737844), - (9997436015069570011, 1606938044258990275), - (7997948812055656009, 1285550435407192220), - (12796718099289049614, 2056880696651507552), - (2858676849947419045, 1645504557321206042), - (13354987924183666206, 1316403645856964833), - (17678631863951955605, 2106245833371143733), - (3074859046935833515, 1684996666696914987), - (13527933681774397782, 1347997333357531989), - (10576647446613305481, 2156795733372051183), - (15840015586774465031, 1725436586697640946), - (8982663654677661702, 1380349269358112757), - (18061610662226169046, 2208558830972980411), - (10759939715039024913, 1766847064778384329), - (12297300586773130254, 1413477651822707463), - (15986332124095098083, 2261564242916331941), - (9099716884534168143, 1809251394333065553), - (14658471137111155161, 1447401115466452442), - (4348079280205103483, 1157920892373161954), - (14335624477811986218, 1852673427797059126), - (7779150767507678651, 1482138742237647301), - (2533971799264232598, 1185710993790117841), - (15122401323048503126, 1897137590064188545), - (12097921058438802501, 1517710072051350836), - (5988988032009131678, 1214168057641080669), - (16961078480698431330, 1942668892225729070), - (13568862784558745064, 1554135113780583256), - (7165741412905085728, 1243308091024466605), - (11465186260648137165, 1989292945639146568), - (16550846638002330379, 1591434356511317254), - (16930026125143774626, 1273147485209053803), - (4951948911778577463, 2037035976334486086), - (272210314680951647, 1629628781067588869), - (3907117066486671641, 1303703024854071095), - (6251387306378674625, 2085924839766513752), - (16069156289328670670, 1668739871813211001), - (9165976216721026213, 1334991897450568801), - (7286864317269821294, 2135987035920910082), - (16897537898041588005, 1708789628736728065), - (13518030318433270404, 1367031702989382452), - (6871453250525591353, 2187250724783011924), - (9186511415162383406, 1749800579826409539), - (11038557946871817048, 1399840463861127631), - (10282995085511086630, 2239744742177804210), - (8226396068408869304, 1791795793742243368), - (13959814484210916090, 1433436634993794694), - (11267656730511734774, 2293498615990071511), - (5324776569667477496, 1834798892792057209), - (7949170070475892320, 1467839114233645767), - (17427382500606444826, 1174271291386916613), - (5747719112518849781, 1878834066219066582), - (15666221734240810795, 1503067252975253265), - (12532977387392648636, 1202453802380202612), - (5295368560860596524, 1923926083808324180), - (4236294848688477220, 1539140867046659344), - (7078384693692692099, 1231312693637327475), - (11325415509908307358, 1970100309819723960), - (9060332407926645887, 1576080247855779168), - (14626963555825137356, 1260864198284623334), - (12335095245094488799, 2017382717255397335), - (9868076196075591040, 1613906173804317868), - (15273158586344293478, 1291124939043454294), - (13369007293925138595, 2065799902469526871), - (7005857020398200553, 1652639921975621497), - (16672732060544291412, 1322111937580497197), - (11918976037903224966, 2115379100128795516), - (5845832015580669650, 1692303280103036413), - (12055363241948356366, 1353842624082429130), - (841837113407818570, 2166148198531886609), - (4362818505468165179, 1732918558825509287), - (14558301248600263113, 1386334847060407429), - (12225235553534690011, 2218135755296651887), - (2401490813343931363, 1774508604237321510), - (1921192650675145090, 1419606883389857208), - (17831303500047873437, 2271371013423771532), - (6886345170554478103, 1817096810739017226), - (1819727321701672159, 1453677448591213781), - (16213177116328979020, 1162941958872971024), - (14873036941900635463, 1860707134196753639), - (15587778368262418694, 1488565707357402911), - (8780873879868024632, 1190852565885922329), - (2981351763563108441, 1905364105417475727), - (13453127855076217722, 1524291284333980581), - (7073153469319063855, 1219433027467184465), - (11317045550910502167, 1951092843947495144), - (12742985255470312057, 1560874275157996115), - (10194388204376249646, 1248699420126396892), - (1553625868034358140, 1997919072202235028), - (8621598323911307159, 1598335257761788022), - (17965325103354776697, 1278668206209430417), - (13987124906400001422, 2045869129935088668), - (121653480894270168, 1636695303948070935), - (97322784715416134, 1309356243158456748), - (14913111714512307107, 2094969989053530796), - (8241140556867935363, 1675975991242824637), - (17660958889720079260, 1340780792994259709), - (17189487779326395846, 2145249268790815535), - (13751590223461116677, 1716199415032652428), - (18379969808252713988, 1372959532026121942), - (14650556434236701088, 2196735251241795108), - (652398703163629901, 1757388200993436087), - (11589965406756634890, 1405910560794748869), - (7475898206584884855, 2249456897271598191), - (2291369750525997561, 1799565517817278553), - (9211793429904618695, 1439652414253822842), - (18428218302589300235, 2303443862806116547), - (7363877012587619542, 1842755090244893238), - (13269799239553916280, 1474204072195914590), - (10615839391643133024, 1179363257756731672), - (2227947767661371545, 1886981212410770676), - (16539753473096738529, 1509584969928616540), - (13231802778477390823, 1207667975942893232), - (6413489186596184024, 1932268761508629172), - (16198837793502678189, 1545815009206903337), - (5580372605318321905, 1236652007365522670), - (8928596168509315048, 1978643211784836272), - (18210923379033183008, 1582914569427869017), - (7190041073742725760, 1266331655542295214), - (436019273762630246, 2026130648867672343), - (7727513048493924843, 1620904519094137874), - (9871359253537050198, 1296723615275310299), - (4726128361433549347, 2074757784440496479), - (7470251503888749801, 1659806227552397183), - (13354898832594820487, 1327844982041917746), - (13989140502667892133, 2124551971267068394), - (14880661216876224029, 1699641577013654715), - (11904528973500979224, 1359713261610923772), - (4289851098633925465, 2175541218577478036), - (18189276137874781665, 1740432974861982428), - (3483374466074094362, 1392346379889585943), - (1884050330976640656, 2227754207823337509), - (5196589079523222848, 1782203366258670007), - (15225317707844309248, 1425762693006936005), - (5913764258841343181, 2281220308811097609), - (8420360221814984868, 1824976247048878087), - (17804334621677718864, 1459980997639102469), - (17932816512084085415, 1167984798111281975), - (10245762345624985047, 1868775676978051161), - (4507261061758077715, 1495020541582440929), - (7295157664148372495, 1196016433265952743), - (7982903447895485668, 1913626293225524389), - (10075671573058298858, 1530901034580419511), - (4371188443704728763, 1224720827664335609), - (14372599139411386667, 1959553324262936974), - (15187428126271019657, 1567642659410349579), - (15839291315758726049, 1254114127528279663), - (3206773216762499739, 2006582604045247462), - (13633465017635730761, 1605266083236197969), - (14596120828850494932, 1284212866588958375), - (4907049252451240275, 2054740586542333401), - (236290587219081897, 1643792469233866721), - (14946427728742906810, 1315033975387093376), - (16535586736504830250, 2104054360619349402), - (5849771759720043554, 1683243488495479522), - (15747863852001765813, 1346594790796383617), - (10439186904235184007, 2154551665274213788), - (15730047152871967852, 1723641332219371030), - (12584037722297574282, 1378913065775496824), - (9066413911450387881, 2206260905240794919), - (10942479943902220628, 1765008724192635935), - (8753983955121776503, 1412006979354108748), - (10317025513452932081, 2259211166966573997), - (874922781278525018, 1807368933573259198), - (8078635854506640661, 1445895146858607358), - (13841606313089133175, 1156716117486885886), - (14767872471458792434, 1850745787979017418), - (746251532941302978, 1480596630383213935), - (597001226353042382, 1184477304306571148), - (15712597221132509104, 1895163686890513836), - (8880728962164096960, 1516130949512411069), - (10793931984473187891, 1212904759609928855), - (17270291175157100626, 1940647615375886168), - (2748186495899949531, 1552518092300708935), - (2198549196719959625, 1242014473840567148), - (18275073973719576693, 1987223158144907436), - (10930710364233751031, 1589778526515925949), - (12433917106128911148, 1271822821212740759), - (8826220925580526867, 2034916513940385215), - (7060976740464421494, 1627933211152308172), - (16716827836597268165, 1302346568921846537), - (11989529279587987770, 2083754510274954460), - (9591623423670390216, 1667003608219963568), - (15051996368420132820, 1333602886575970854), - (13015147745246481542, 2133764618521553367), - (3033420566713364587, 1707011694817242694), - (6116085268112601993, 1365609355853794155), - (9785736428980163188, 2184974969366070648), - (15207286772667951197, 1747979975492856518), - (1097782973908629988, 1398383980394285215), - (1756452758253807981, 2237414368630856344), - (5094511021344956708, 1789931494904685075), - (4075608817075965366, 1431945195923748060), - (6520974107321544586, 2291112313477996896), - (1527430471115325346, 1832889850782397517), - (12289990821117991246, 1466311880625918013), - (17210690286378213644, 1173049504500734410), - (9090360384495590213, 1876879207201175057), - (18340334751822203140, 1501503365760940045), - (14672267801457762512, 1201202692608752036), - (16096930852848599373, 1921924308174003258), - (1809498238053148529, 1537539446539202607), - (12515645034668249793, 1230031557231362085), - (1578287981759648052, 1968050491570179337), - (12330676829633449412, 1574440393256143469), - (13553890278448669853, 1259552314604914775), - (3239480371808320148, 2015283703367863641), - (17348979556414297411, 1612226962694290912), - (6500486015647617283, 1289781570155432730), - (10400777625036187652, 2063650512248692368), - (15699319729512770768, 1650920409798953894), - (16248804598352126938, 1320736327839163115), - (7551343283653851484, 2113178124542660985), - (6041074626923081187, 1690542499634128788), - (12211557331022285596, 1352433999707303030), - (1091747655926105338, 2163894399531684849), - (4562746939482794594, 1731115519625347879), - (7339546366328145998, 1384892415700278303), - (8053925371383123274, 2215827865120445285), - (6443140297106498619, 1772662292096356228), - (12533209867169019542, 1418129833677084982), - (5295740528502789974, 2269007733883335972), - (15304638867027962949, 1815206187106668777), - (4865013464138549713, 1452164949685335022), - (14960057215536570740, 1161731959748268017), - (9178696285890871890, 1858771135597228828), - (14721654658196518159, 1487016908477783062), - (4398626097073393881, 1189613526782226450), - (7037801755317430209, 1903381642851562320), - (5630241404253944167, 1522705314281249856), - (814844308661245011, 1218164251424999885), - (1303750893857992017, 1949062802279999816), - (15800395974054034906, 1559250241823999852), - (5261619149759407279, 1247400193459199882), - (12107939454356961969, 1995840309534719811), - (5997002748743659252, 1596672247627775849), - (8486951013736837725, 1277337798102220679), - (2511075177753209390, 2043740476963553087), - (13076906586428298482, 1634992381570842469), - (14150874083884549109, 1307993905256673975), - (4194654460505726958, 2092790248410678361), - (18113118827372222859, 1674232198728542688), - (3422448617672047318, 1339385758982834151), - (16543964232501006678, 2143017214372534641), - (9545822571258895019, 1714413771498027713), - (15015355686490936662, 1371531017198422170), - (5577825024675947042, 2194449627517475473), - (11840957649224578280, 1755559702013980378), - (16851463748863483271, 1404447761611184302), - (12204946739213931940, 2247116418577894884), - (13453306206113055875, 1797693134862315907), - (3383947335406624054, 1438154507889852726), - (16482362180876329456, 2301047212623764361), - (9496540929959153242, 1840837770099011489), - (11286581558709232917, 1472670216079209191), - (5339916432225476010, 1178136172863367353), - (4854517476818851293, 1885017876581387765), - (3883613981455081034, 1508014301265110212), - (14174937629389795797, 1206411441012088169), - (11611853762797942306, 1930258305619341071), - (5600134195496443521, 1544206644495472857), - (15548153800622885787, 1235365315596378285), - (6430302007287065643, 1976584504954205257), - (16212288050055383484, 1581267603963364205), - (12969830440044306787, 1265014083170691364), - (9683682259845159889, 2024022533073106183), - (15125643437359948558, 1619218026458484946), - (8411165935146048523, 1295374421166787957), - (17147214310975587960, 2072599073866860731), - (10028422634038560045, 1658079259093488585), - (8022738107230848036, 1326463407274790868), - (9147032156827446534, 2122341451639665389), - (11006974540203867551, 1697873161311732311), - (5116230817421183718, 1358298529049385849), - (15564666937357714594, 2173277646479017358), - (1383687105660440706, 1738622117183213887), - (12174996128754083534, 1390897693746571109), - (8411947361780802685, 2225436309994513775), - (6729557889424642148, 1780349047995611020), - (5383646311539713719, 1424279238396488816), - (1235136468979721303, 2278846781434382106), - (15745504434151418335, 1823077425147505684), - (16285752362063044992, 1458461940118004547), - (5649904260166615347, 1166769552094403638), - (5350498001524674232, 1866831283351045821), - (591049586477829062, 1493465026680836657), - (11540886113407994219, 1194772021344669325), - (18673707743239135, 1911635234151470921), - (14772334225162232601, 1529308187321176736), - (8128518565387875758, 1223446549856941389), - (1937583260394870242, 1957514479771106223), - (8928764237799716840, 1566011583816884978), - (14521709019723594119, 1252809267053507982), - (8477339172590109297, 2004494827285612772), - (17849917782297818407, 1603595861828490217), - (6901236596354434079, 1282876689462792174), - (18420676183650915173, 2052602703140467478), - (3668494502695001169, 1642082162512373983), - (10313493231639821582, 1313665730009899186), - (9122891541139893884, 2101865168015838698), - (14677010862395735754, 1681492134412670958), - (673562245690857633, 1345193707530136767), -]; - -pub static DOUBLE_POW5_SPLIT: [(u64, u64); DOUBLE_POW5_TABLE_SIZE] = [ - (0, 1152921504606846976), - (0, 1441151880758558720), - (0, 1801439850948198400), - (0, 2251799813685248000), - (0, 1407374883553280000), - (0, 1759218604441600000), - (0, 2199023255552000000), - (0, 1374389534720000000), - (0, 1717986918400000000), - (0, 2147483648000000000), - (0, 1342177280000000000), - (0, 1677721600000000000), - (0, 2097152000000000000), - (0, 1310720000000000000), - (0, 1638400000000000000), - (0, 2048000000000000000), - (0, 1280000000000000000), - (0, 1600000000000000000), - (0, 2000000000000000000), - (0, 1250000000000000000), - (0, 1562500000000000000), - (0, 1953125000000000000), - (0, 1220703125000000000), - (0, 1525878906250000000), - (0, 1907348632812500000), - (0, 1192092895507812500), - (0, 1490116119384765625), - (4611686018427387904, 1862645149230957031), - (9799832789158199296, 1164153218269348144), - (12249790986447749120, 1455191522836685180), - (15312238733059686400, 1818989403545856475), - (14528612397897220096, 2273736754432320594), - (13692068767113150464, 1421085471520200371), - (12503399940464050176, 1776356839400250464), - (15629249925580062720, 2220446049250313080), - (9768281203487539200, 1387778780781445675), - (7598665485932036096, 1734723475976807094), - (274959820560269312, 2168404344971008868), - (9395221924704944128, 1355252715606880542), - (2520655369026404352, 1694065894508600678), - (12374191248137781248, 2117582368135750847), - (14651398557727195136, 1323488980084844279), - (13702562178731606016, 1654361225106055349), - (3293144668132343808, 2067951531382569187), - (18199116482078572544, 1292469707114105741), - (8913837547316051968, 1615587133892632177), - (15753982952572452864, 2019483917365790221), - (12152082354571476992, 1262177448353618888), - (15190102943214346240, 1577721810442023610), - (9764256642163156992, 1972152263052529513), - (17631875447420442880, 1232595164407830945), - (8204786253993389888, 1540743955509788682), - (1032610780636961552, 1925929944387235853), - (2951224747111794922, 1203706215242022408), - (3689030933889743652, 1504632769052528010), - (13834660704216955373, 1880790961315660012), - (17870034976990372916, 1175494350822287507), - (17725857702810578241, 1469367938527859384), - (3710578054803671186, 1836709923159824231), - (26536550077201078, 2295887403949780289), - (11545800389866720434, 1434929627468612680), - (14432250487333400542, 1793662034335765850), - (8816941072311974870, 2242077542919707313), - (17039803216263454053, 1401298464324817070), - (12076381983474541759, 1751623080406021338), - (5872105442488401391, 2189528850507526673), - (15199280947623720629, 1368455531567204170), - (9775729147674874978, 1710569414459005213), - (16831347453020981627, 2138211768073756516), - (1296220121283337709, 1336382355046097823), - (15455333206886335848, 1670477943807622278), - (10095794471753144002, 2088097429759527848), - (6309871544845715001, 1305060893599704905), - (12499025449484531656, 1631326116999631131), - (11012095793428276666, 2039157646249538914), - (11494245889320060820, 1274473528905961821), - (532749306367912313, 1593091911132452277), - (5277622651387278295, 1991364888915565346), - (7910200175544436838, 1244603055572228341), - (14499436237857933952, 1555753819465285426), - (8900923260467641632, 1944692274331606783), - (12480606065433357876, 1215432671457254239), - (10989071563364309441, 1519290839321567799), - (9124653435777998898, 1899113549151959749), - (8008751406574943263, 1186945968219974843), - (5399253239791291175, 1483682460274968554), - (15972438586593889776, 1854603075343710692), - (759402079766405302, 1159126922089819183), - (14784310654990170340, 1448908652612273978), - (9257016281882937117, 1811135815765342473), - (16182956370781059300, 2263919769706678091), - (7808504722524468110, 1414949856066673807), - (5148944884728197234, 1768687320083342259), - (1824495087482858639, 2210859150104177824), - (1140309429676786649, 1381786968815111140), - (1425386787095983311, 1727233711018888925), - (6393419502297367043, 2159042138773611156), - (13219259225790630210, 1349401336733506972), - (16524074032238287762, 1686751670916883715), - (16043406521870471799, 2108439588646104644), - (803757039314269066, 1317774742903815403), - (14839754354425000045, 1647218428629769253), - (4714634887749086344, 2059023035787211567), - (9864175832484260821, 1286889397367007229), - (16941905809032713930, 1608611746708759036), - (2730638187581340797, 2010764683385948796), - (10930020904093113806, 1256727927116217997), - (18274212148543780162, 1570909908895272496), - (4396021111970173586, 1963637386119090621), - (5053356204195052443, 1227273366324431638), - (15540067292098591362, 1534091707905539547), - (14813398096695851299, 1917614634881924434), - (13870059828862294966, 1198509146801202771), - (12725888767650480803, 1498136433501503464), - (15907360959563101004, 1872670541876879330), - (14553786618154326031, 1170419088673049581), - (4357175217410743827, 1463023860841311977), - (10058155040190817688, 1828779826051639971), - (7961007781811134206, 2285974782564549964), - (14199001900486734687, 1428734239102843727), - (13137066357181030455, 1785917798878554659), - (11809646928048900164, 2232397248598193324), - (16604401366885338411, 1395248280373870827), - (16143815690179285109, 1744060350467338534), - (10956397575869330579, 2180075438084173168), - (6847748484918331612, 1362547148802608230), - (17783057643002690323, 1703183936003260287), - (17617136035325974999, 2128979920004075359), - (17928239049719816230, 1330612450002547099), - (17798612793722382384, 1663265562503183874), - (13024893955298202172, 2079081953128979843), - (5834715712847682405, 1299426220705612402), - (16516766677914378815, 1624282775882015502), - (11422586310538197711, 2030353469852519378), - (11750802462513761473, 1268970918657824611), - (10076817059714813937, 1586213648322280764), - (12596021324643517422, 1982767060402850955), - (5566670318688504437, 1239229412751781847), - (2346651879933242642, 1549036765939727309), - (7545000868343941206, 1936295957424659136), - (4715625542714963254, 1210184973390411960), - (5894531928393704067, 1512731216738014950), - (16591536947346905892, 1890914020922518687), - (17287239619732898039, 1181821263076574179), - (16997363506238734644, 1477276578845717724), - (2799960309088866689, 1846595723557147156), - (10973347230035317489, 1154122327223216972), - (13716684037544146861, 1442652909029021215), - (12534169028502795672, 1803316136286276519), - (11056025267201106687, 2254145170357845649), - (18439230838069161439, 1408840731473653530), - (13825666510731675991, 1761050914342066913), - (3447025083132431277, 2201313642927583642), - (6766076695385157452, 1375821026829739776), - (8457595869231446815, 1719776283537174720), - (10571994836539308519, 2149720354421468400), - (6607496772837067824, 1343575221513417750), - (17482743002901110588, 1679469026891772187), - (17241742735199000331, 2099336283614715234), - (15387775227926763111, 1312085177259197021), - (5399660979626290177, 1640106471573996277), - (11361262242960250625, 2050133089467495346), - (11712474920277544544, 1281333180917184591), - (10028907631919542777, 1601666476146480739), - (7924448521472040567, 2002083095183100924), - (14176152362774801162, 1251301934489438077), - (3885132398186337741, 1564127418111797597), - (9468101516160310080, 1955159272639746996), - (15140935484454969608, 1221974545399841872), - (479425281859160394, 1527468181749802341), - (5210967620751338397, 1909335227187252926), - (17091912818251750210, 1193334516992033078), - (12141518985959911954, 1491668146240041348), - (15176898732449889943, 1864585182800051685), - (11791404716994875166, 1165365739250032303), - (10127569877816206054, 1456707174062540379), - (8047776328842869663, 1820883967578175474), - (836348374198811271, 2276104959472719343), - (7440246761515338900, 1422565599670449589), - (13911994470321561530, 1778206999588061986), - (8166621051047176104, 2222758749485077483), - (2798295147690791113, 1389224218428173427), - (17332926989895652603, 1736530273035216783), - (17054472718942177850, 2170662841294020979), - (8353202440125167204, 1356664275808763112), - (10441503050156459005, 1695830344760953890), - (3828506775840797949, 2119787930951192363), - (86973725686804766, 1324867456844495227), - (13943775212390669669, 1656084321055619033), - (3594660960206173375, 2070105401319523792), - (2246663100128858359, 1293815875824702370), - (12031700912015848757, 1617269844780877962), - (5816254103165035138, 2021587305976097453), - (5941001823691840913, 1263492066235060908), - (7426252279614801142, 1579365082793826135), - (4671129331091113523, 1974206353492282669), - (5225298841145639904, 1233878970932676668), - (6531623551432049880, 1542348713665845835), - (3552843420862674446, 1927935892082307294), - (16055585193321335241, 1204959932551442058), - (10846109454796893243, 1506199915689302573), - (18169322836923504458, 1882749894611628216), - (11355826773077190286, 1176718684132267635), - (9583097447919099954, 1470898355165334544), - (11978871809898874942, 1838622943956668180), - (14973589762373593678, 2298278679945835225), - (2440964573842414192, 1436424174966147016), - (3051205717303017741, 1795530218707683770), - (13037379183483547984, 2244412773384604712), - (8148361989677217490, 1402757983365377945), - (14797138505523909766, 1753447479206722431), - (13884737113477499304, 2191809349008403039), - (15595489723564518921, 1369880843130251899), - (14882676136028260747, 1712351053912814874), - (9379973133180550126, 2140438817391018593), - (17391698254306313589, 1337774260869386620), - (3292878744173340370, 1672217826086733276), - (4116098430216675462, 2090272282608416595), - (266718509671728212, 1306420176630260372), - (333398137089660265, 1633025220787825465), - (5028433689789463235, 2041281525984781831), - (10060300083759496378, 1275800953740488644), - (12575375104699370472, 1594751192175610805), - (1884160825592049379, 1993438990219513507), - (17318501580490888525, 1245899368887195941), - (7813068920331446945, 1557374211108994927), - (5154650131986920777, 1946717763886243659), - (915813323278131534, 1216698602428902287), - (14979824709379828129, 1520873253036127858), - (9501408849870009354, 1901091566295159823), - (12855909558809837702, 1188182228934474889), - (2234828893230133415, 1485227786168093612), - (2793536116537666769, 1856534732710117015), - (8663489100477123587, 1160334207943823134), - (1605989338741628675, 1450417759929778918), - (11230858710281811652, 1813022199912223647), - (9426887369424876662, 2266277749890279559), - (12809333633531629769, 1416423593681424724), - (16011667041914537212, 1770529492101780905), - (6179525747111007803, 2213161865127226132), - (13085575628799155685, 1383226165704516332), - (16356969535998944606, 1729032707130645415), - (15834525901571292854, 2161290883913306769), - (2979049660840976177, 1350806802445816731), - (17558870131333383934, 1688508503057270913), - (8113529608884566205, 2110635628821588642), - (9682642023980241782, 1319147268013492901), - (16714988548402690132, 1648934085016866126), - (11670363648648586857, 2061167606271082658), - (11905663298832754689, 1288229753919426661), - (1047021068258779650, 1610287192399283327), - (15143834390605638274, 2012858990499104158), - (4853210475701136017, 1258036869061940099), - (1454827076199032118, 1572546086327425124), - (1818533845248790147, 1965682607909281405), - (3442426662494187794, 1228551629943300878), - (13526405364972510550, 1535689537429126097), - (3072948650933474476, 1919611921786407622), - (15755650962115585259, 1199757451116504763), - (15082877684217093670, 1499696813895630954), - (9630225068416591280, 1874621017369538693), - (8324733676974063502, 1171638135855961683), - (5794231077790191473, 1464547669819952104), - (7242788847237739342, 1830684587274940130), - (18276858095901949986, 2288355734093675162), - (16034722328366106645, 1430222333808546976), - (1596658836748081690, 1787777917260683721), - (6607509564362490017, 2234722396575854651), - (1823850468512862308, 1396701497859909157), - (6891499104068465790, 1745876872324886446), - (17837745916940358045, 2182346090406108057), - (4231062170446641922, 1363966306503817536), - (5288827713058302403, 1704957883129771920), - (6611034641322878003, 2131197353912214900), - (13355268687681574560, 1331998346195134312), - (16694085859601968200, 1664997932743917890), - (11644235287647684442, 2081247415929897363), - (4971804045566108824, 1300779634956185852), - (6214755056957636030, 1625974543695232315), - (3156757802769657134, 2032468179619040394), - (6584659645158423613, 1270292612261900246), - (17454196593302805324, 1587865765327375307), - (17206059723201118751, 1984832206659219134), - (6142101308573311315, 1240520129162011959), - (3065940617289251240, 1550650161452514949), - (8444111790038951954, 1938312701815643686), - (665883850346957067, 1211445438634777304), - (832354812933696334, 1514306798293471630), - (10263815553021896226, 1892883497866839537), - (17944099766707154901, 1183052186166774710), - (13206752671529167818, 1478815232708468388), - (16508440839411459773, 1848519040885585485), - (12623618533845856310, 1155324400553490928), - (15779523167307320387, 1444155500691863660), - (1277659885424598868, 1805194375864829576), - (1597074856780748586, 2256492969831036970), - (5609857803915355770, 1410308106144398106), - (16235694291748970521, 1762885132680497632), - (1847873790976661535, 2203606415850622041), - (12684136165428883219, 1377254009906638775), - (11243484188358716120, 1721567512383298469), - (219297180166231438, 2151959390479123087), - (7054589765244976505, 1344974619049451929), - (13429923224983608535, 1681218273811814911), - (12175718012802122765, 2101522842264768639), - (14527352785642408584, 1313451776415480399), - (13547504963625622826, 1641814720519350499), - (12322695186104640628, 2052268400649188124), - (16925056528170176201, 1282667750405742577), - (7321262604930556539, 1603334688007178222), - (18374950293017971482, 2004168360008972777), - (4566814905495150320, 1252605225005607986), - (14931890668723713708, 1565756531257009982), - (9441491299049866327, 1957195664071262478), - (1289246043478778550, 1223247290044539049), - (6223243572775861092, 1529059112555673811), - (3167368447542438461, 1911323890694592264), - (1979605279714024038, 1194577431684120165), - (7086192618069917952, 1493221789605150206), - (18081112809442173248, 1866527237006437757), - (13606538515115052232, 1166579523129023598), - (7784801107039039482, 1458224403911279498), - (507629346944023544, 1822780504889099373), - (5246222702107417334, 2278475631111374216), - (3278889188817135834, 1424047269444608885), - (8710297504448807696, 1780059086805761106), -]; diff --git a/vendor/ryu/src/d2s_intrinsics.rs b/vendor/ryu/src/d2s_intrinsics.rs deleted file mode 100644 index a4e1fb1..0000000 --- a/vendor/ryu/src/d2s_intrinsics.rs +++ /dev/null @@ -1,89 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -use core::ptr; - -#[cfg_attr(feature = "no-panic", inline)] -pub fn div5(x: u64) -> u64 { - x / 5 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn div10(x: u64) -> u64 { - x / 10 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn div100(x: u64) -> u64 { - x / 100 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub(crate) fn pow5_factor(mut value: u64) -> u32 { - const M_INV_5: u64 = 14757395258967641293; // 5 * m_inv_5 = 1 (mod 2^64) - const N_DIV_5: u64 = 3689348814741910323; // #{ n | n = 0 (mod 2^64) } = 2^64 / 5 - let mut count = 0u32; - loop { - debug_assert!(value != 0); - value = value.wrapping_mul(M_INV_5); - if value > N_DIV_5 { - break; - } - count += 1; - } - count -} - -// Returns true if value is divisible by 5^p. -#[cfg_attr(feature = "no-panic", inline)] -pub fn multiple_of_power_of_5(value: u64, p: u32) -> bool { - // I tried a case distinction on p, but there was no performance difference. - pow5_factor(value) >= p -} - -// Returns true if value is divisible by 2^p. -#[cfg_attr(feature = "no-panic", inline)] -pub fn multiple_of_power_of_2(value: u64, p: u32) -> bool { - debug_assert!(value != 0); - debug_assert!(p < 64); - // __builtin_ctzll doesn't appear to be faster here. - (value & ((1u64 << p) - 1)) == 0 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn mul_shift_64(m: u64, mul: &(u64, u64), j: u32) -> u64 { - let b0 = m as u128 * mul.0 as u128; - let b2 = m as u128 * mul.1 as u128; - (((b0 >> 64) + b2) >> (j - 64)) as u64 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn mul_shift_all_64( - m: u64, - mul: &(u64, u64), - j: u32, - vp: *mut u64, - vm: *mut u64, - mm_shift: u32, -) -> u64 { - ptr::write(vp, mul_shift_64(4 * m + 2, mul, j)); - ptr::write(vm, mul_shift_64(4 * m - 1 - mm_shift as u64, mul, j)); - mul_shift_64(4 * m, mul, j) -} diff --git a/vendor/ryu/src/d2s_small_table.rs b/vendor/ryu/src/d2s_small_table.rs deleted file mode 100644 index 262fc04..0000000 --- a/vendor/ryu/src/d2s_small_table.rs +++ /dev/null @@ -1,142 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -use crate::common::*; - -pub static DOUBLE_POW5_INV_SPLIT2: [(u64, u64); 15] = [ - (1, 2305843009213693952), - (5955668970331000884, 1784059615882449851), - (8982663654677661702, 1380349269358112757), - (7286864317269821294, 2135987035920910082), - (7005857020398200553, 1652639921975621497), - (17965325103354776697, 1278668206209430417), - (8928596168509315048, 1978643211784836272), - (10075671573058298858, 1530901034580419511), - (597001226353042382, 1184477304306571148), - (1527430471115325346, 1832889850782397517), - (12533209867169019542, 1418129833677084982), - (5577825024675947042, 2194449627517475473), - (11006974540203867551, 1697873161311732311), - (10313493231639821582, 1313665730009899186), - (12701016819766672773, 2032799256770390445), -]; - -pub static POW5_INV_OFFSETS: [u32; 19] = [ - 0x54544554, 0x04055545, 0x10041000, 0x00400414, 0x40010000, 0x41155555, 0x00000454, 0x00010044, - 0x40000000, 0x44000041, 0x50454450, 0x55550054, 0x51655554, 0x40004000, 0x01000001, 0x00010500, - 0x51515411, 0x05555554, 0x00000000, -]; - -pub static DOUBLE_POW5_SPLIT2: [(u64, u64); 13] = [ - (0, 1152921504606846976), - (0, 1490116119384765625), - (1032610780636961552, 1925929944387235853), - (7910200175544436838, 1244603055572228341), - (16941905809032713930, 1608611746708759036), - (13024893955298202172, 2079081953128979843), - (6607496772837067824, 1343575221513417750), - (17332926989895652603, 1736530273035216783), - (13037379183483547984, 2244412773384604712), - (1605989338741628675, 1450417759929778918), - (9630225068416591280, 1874621017369538693), - (665883850346957067, 1211445438634777304), - (14931890668723713708, 1565756531257009982), -]; - -pub static POW5_OFFSETS: [u32; 21] = [ - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x59695995, 0x55545555, 0x56555515, - 0x41150504, 0x40555410, 0x44555145, 0x44504540, 0x45555550, 0x40004000, 0x96440440, 0x55565565, - 0x54454045, 0x40154151, 0x55559155, 0x51405555, 0x00000105, -]; - -pub static DOUBLE_POW5_TABLE: [u64; 26] = [ - 1, - 5, - 25, - 125, - 625, - 3125, - 15625, - 78125, - 390625, - 1953125, - 9765625, - 48828125, - 244140625, - 1220703125, - 6103515625, - 30517578125, - 152587890625, - 762939453125, - 3814697265625, - 19073486328125, - 95367431640625, - 476837158203125, - 2384185791015625, - 11920928955078125, - 59604644775390625, - 298023223876953125, -]; - -// Computes 5^i in the form required by Ryū. -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn compute_pow5(i: u32) -> (u64, u64) { - let base = i / DOUBLE_POW5_TABLE.len() as u32; - let base2 = base * DOUBLE_POW5_TABLE.len() as u32; - let offset = i - base2; - debug_assert!(base < DOUBLE_POW5_SPLIT2.len() as u32); - let mul = *DOUBLE_POW5_SPLIT2.get_unchecked(base as usize); - if offset == 0 { - return mul; - } - debug_assert!(offset < DOUBLE_POW5_TABLE.len() as u32); - let m = *DOUBLE_POW5_TABLE.get_unchecked(offset as usize); - let b0 = m as u128 * mul.0 as u128; - let b2 = m as u128 * mul.1 as u128; - let delta = pow5bits(i as i32) - pow5bits(base2 as i32); - debug_assert!(i / 16 < POW5_OFFSETS.len() as u32); - let shifted_sum = (b0 >> delta) - + (b2 << (64 - delta)) - + ((*POW5_OFFSETS.get_unchecked((i / 16) as usize) >> ((i % 16) << 1)) & 3) as u128; - (shifted_sum as u64, (shifted_sum >> 64) as u64) -} - -// Computes 5^-i in the form required by Ryū. -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn compute_inv_pow5(i: u32) -> (u64, u64) { - let base = (i + DOUBLE_POW5_TABLE.len() as u32 - 1) / DOUBLE_POW5_TABLE.len() as u32; - let base2 = base * DOUBLE_POW5_TABLE.len() as u32; - let offset = base2 - i; - debug_assert!(base < DOUBLE_POW5_INV_SPLIT2.len() as u32); - let mul = *DOUBLE_POW5_INV_SPLIT2.get_unchecked(base as usize); // 1/5^base2 - if offset == 0 { - return mul; - } - debug_assert!(offset < DOUBLE_POW5_TABLE.len() as u32); - let m = *DOUBLE_POW5_TABLE.get_unchecked(offset as usize); // 5^offset - let b0 = m as u128 * (mul.0 - 1) as u128; - let b2 = m as u128 * mul.1 as u128; // 1/5^base2 * 5^offset = 1/5^(base2-offset) = 1/5^i - let delta = pow5bits(base2 as i32) - pow5bits(i as i32); - debug_assert!(base < POW5_INV_OFFSETS.len() as u32); - let shifted_sum = ((b0 >> delta) + (b2 << (64 - delta))) - + 1 - + ((*POW5_INV_OFFSETS.get_unchecked((i / 16) as usize) >> ((i % 16) << 1)) & 3) as u128; - (shifted_sum as u64, (shifted_sum >> 64) as u64) -} diff --git a/vendor/ryu/src/digit_table.rs b/vendor/ryu/src/digit_table.rs deleted file mode 100644 index d871f03..0000000 --- a/vendor/ryu/src/digit_table.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -// A table of all two-digit numbers. This is used to speed up decimal digit -// generation by copying pairs of digits into the final output. -pub static DIGIT_TABLE: [u8; 200] = *b"\ - 0001020304050607080910111213141516171819\ - 2021222324252627282930313233343536373839\ - 4041424344454647484950515253545556575859\ - 6061626364656667686970717273747576777879\ - 8081828384858687888990919293949596979899"; diff --git a/vendor/ryu/src/f2s.rs b/vendor/ryu/src/f2s.rs deleted file mode 100644 index eeb457a..0000000 --- a/vendor/ryu/src/f2s.rs +++ /dev/null @@ -1,176 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -use crate::common::*; -use crate::f2s_intrinsics::*; - -pub const FLOAT_MANTISSA_BITS: u32 = 23; -pub const FLOAT_EXPONENT_BITS: u32 = 8; -const FLOAT_BIAS: i32 = 127; -pub use crate::f2s_intrinsics::{FLOAT_POW5_BITCOUNT, FLOAT_POW5_INV_BITCOUNT}; - -// A floating decimal representing m * 10^e. -pub struct FloatingDecimal32 { - pub mantissa: u32, - // Decimal exponent's range is -45 to 38 - // inclusive, and can fit in i16 if needed. - pub exponent: i32, -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn f2d(ieee_mantissa: u32, ieee_exponent: u32) -> FloatingDecimal32 { - let (e2, m2) = if ieee_exponent == 0 { - ( - // We subtract 2 so that the bounds computation has 2 additional bits. - 1 - FLOAT_BIAS - FLOAT_MANTISSA_BITS as i32 - 2, - ieee_mantissa, - ) - } else { - ( - ieee_exponent as i32 - FLOAT_BIAS - FLOAT_MANTISSA_BITS as i32 - 2, - (1u32 << FLOAT_MANTISSA_BITS) | ieee_mantissa, - ) - }; - let even = (m2 & 1) == 0; - let accept_bounds = even; - - // Step 2: Determine the interval of valid decimal representations. - let mv = 4 * m2; - let mp = 4 * m2 + 2; - // Implicit bool -> int conversion. True is 1, false is 0. - let mm_shift = (ieee_mantissa != 0 || ieee_exponent <= 1) as u32; - let mm = 4 * m2 - 1 - mm_shift; - - // Step 3: Convert to a decimal power base using 64-bit arithmetic. - let mut vr: u32; - let mut vp: u32; - let mut vm: u32; - let e10: i32; - let mut vm_is_trailing_zeros = false; - let mut vr_is_trailing_zeros = false; - let mut last_removed_digit = 0u8; - if e2 >= 0 { - let q = log10_pow2(e2); - e10 = q as i32; - let k = FLOAT_POW5_INV_BITCOUNT + pow5bits(q as i32) - 1; - let i = -e2 + q as i32 + k; - vr = mul_pow5_inv_div_pow2(mv, q, i); - vp = mul_pow5_inv_div_pow2(mp, q, i); - vm = mul_pow5_inv_div_pow2(mm, q, i); - if q != 0 && (vp - 1) / 10 <= vm / 10 { - // We need to know one removed digit even if we are not going to loop below. We could use - // q = X - 1 above, except that would require 33 bits for the result, and we've found that - // 32-bit arithmetic is faster even on 64-bit machines. - let l = FLOAT_POW5_INV_BITCOUNT + pow5bits(q as i32 - 1) - 1; - last_removed_digit = - (mul_pow5_inv_div_pow2(mv, q - 1, -e2 + q as i32 - 1 + l) % 10) as u8; - } - if q <= 9 { - // The largest power of 5 that fits in 24 bits is 5^10, but q <= 9 seems to be safe as well. - // Only one of mp, mv, and mm can be a multiple of 5, if any. - if mv % 5 == 0 { - vr_is_trailing_zeros = multiple_of_power_of_5_32(mv, q); - } else if accept_bounds { - vm_is_trailing_zeros = multiple_of_power_of_5_32(mm, q); - } else { - vp -= multiple_of_power_of_5_32(mp, q) as u32; - } - } - } else { - let q = log10_pow5(-e2); - e10 = q as i32 + e2; - let i = -e2 - q as i32; - let k = pow5bits(i) - FLOAT_POW5_BITCOUNT; - let mut j = q as i32 - k; - vr = mul_pow5_div_pow2(mv, i as u32, j); - vp = mul_pow5_div_pow2(mp, i as u32, j); - vm = mul_pow5_div_pow2(mm, i as u32, j); - if q != 0 && (vp - 1) / 10 <= vm / 10 { - j = q as i32 - 1 - (pow5bits(i + 1) - FLOAT_POW5_BITCOUNT); - last_removed_digit = (mul_pow5_div_pow2(mv, (i + 1) as u32, j) % 10) as u8; - } - if q <= 1 { - // {vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q trailing 0 bits. - // mv = 4 * m2, so it always has at least two trailing 0 bits. - vr_is_trailing_zeros = true; - if accept_bounds { - // mm = mv - 1 - mm_shift, so it has 1 trailing 0 bit iff mm_shift == 1. - vm_is_trailing_zeros = mm_shift == 1; - } else { - // mp = mv + 2, so it always has at least one trailing 0 bit. - vp -= 1; - } - } else if q < 31 { - // TODO(ulfjack): Use a tighter bound here. - vr_is_trailing_zeros = multiple_of_power_of_2_32(mv, q - 1); - } - } - - // Step 4: Find the shortest decimal representation in the interval of valid representations. - let mut removed = 0i32; - let output = if vm_is_trailing_zeros || vr_is_trailing_zeros { - // General case, which happens rarely (~4.0%). - while vp / 10 > vm / 10 { - vm_is_trailing_zeros &= vm - (vm / 10) * 10 == 0; - vr_is_trailing_zeros &= last_removed_digit == 0; - last_removed_digit = (vr % 10) as u8; - vr /= 10; - vp /= 10; - vm /= 10; - removed += 1; - } - if vm_is_trailing_zeros { - while vm % 10 == 0 { - vr_is_trailing_zeros &= last_removed_digit == 0; - last_removed_digit = (vr % 10) as u8; - vr /= 10; - vp /= 10; - vm /= 10; - removed += 1; - } - } - if vr_is_trailing_zeros && last_removed_digit == 5 && vr % 2 == 0 { - // Round even if the exact number is .....50..0. - last_removed_digit = 4; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - vr + ((vr == vm && (!accept_bounds || !vm_is_trailing_zeros)) || last_removed_digit >= 5) - as u32 - } else { - // Specialized for the common case (~96.0%). Percentages below are relative to this. - // Loop iterations below (approximately): - // 0: 13.6%, 1: 70.7%, 2: 14.1%, 3: 1.39%, 4: 0.14%, 5+: 0.01% - while vp / 10 > vm / 10 { - last_removed_digit = (vr % 10) as u8; - vr /= 10; - vp /= 10; - vm /= 10; - removed += 1; - } - // We need to take vr + 1 if vr is outside bounds or we need to round up. - vr + (vr == vm || last_removed_digit >= 5) as u32 - }; - let exp = e10 + removed; - - FloatingDecimal32 { - exponent: exp, - mantissa: output, - } -} diff --git a/vendor/ryu/src/f2s_intrinsics.rs b/vendor/ryu/src/f2s_intrinsics.rs deleted file mode 100644 index 1a35218..0000000 --- a/vendor/ryu/src/f2s_intrinsics.rs +++ /dev/null @@ -1,113 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -use crate::d2s; - -pub const FLOAT_POW5_INV_BITCOUNT: i32 = d2s::DOUBLE_POW5_INV_BITCOUNT - 64; -pub const FLOAT_POW5_BITCOUNT: i32 = d2s::DOUBLE_POW5_BITCOUNT - 64; - -#[cfg_attr(feature = "no-panic", inline)] -fn pow5factor_32(mut value: u32) -> u32 { - let mut count = 0u32; - loop { - debug_assert!(value != 0); - let q = value / 5; - let r = value % 5; - if r != 0 { - break; - } - value = q; - count += 1; - } - count -} - -// Returns true if value is divisible by 5^p. -#[cfg_attr(feature = "no-panic", inline)] -pub fn multiple_of_power_of_5_32(value: u32, p: u32) -> bool { - pow5factor_32(value) >= p -} - -// Returns true if value is divisible by 2^p. -#[cfg_attr(feature = "no-panic", inline)] -pub fn multiple_of_power_of_2_32(value: u32, p: u32) -> bool { - // __builtin_ctz doesn't appear to be faster here. - (value & ((1u32 << p) - 1)) == 0 -} - -// It seems to be slightly faster to avoid uint128_t here, although the -// generated code for uint128_t looks slightly nicer. -#[cfg_attr(feature = "no-panic", inline)] -fn mul_shift_32(m: u32, factor: u64, shift: i32) -> u32 { - debug_assert!(shift > 32); - - // The casts here help MSVC to avoid calls to the __allmul library - // function. - let factor_lo = factor as u32; - let factor_hi = (factor >> 32) as u32; - let bits0 = m as u64 * factor_lo as u64; - let bits1 = m as u64 * factor_hi as u64; - - let sum = (bits0 >> 32) + bits1; - let shifted_sum = sum >> (shift - 32); - debug_assert!(shifted_sum <= u32::max_value() as u64); - shifted_sum as u32 -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn mul_pow5_inv_div_pow2(m: u32, q: u32, j: i32) -> u32 { - #[cfg(feature = "small")] - { - // The inverse multipliers are defined as [2^x / 5^y] + 1; the upper 64 - // bits from the double lookup table are the correct bits for [2^x / - // 5^y], so we have to add 1 here. Note that we rely on the fact that - // the added 1 that's already stored in the table never overflows into - // the upper 64 bits. - let pow5 = unsafe { d2s::compute_inv_pow5(q) }; - mul_shift_32(m, pow5.1 + 1, j) - } - - #[cfg(not(feature = "small"))] - { - debug_assert!(q < d2s::DOUBLE_POW5_INV_SPLIT.len() as u32); - unsafe { - mul_shift_32( - m, - d2s::DOUBLE_POW5_INV_SPLIT.get_unchecked(q as usize).1 + 1, - j, - ) - } - } -} - -#[cfg_attr(feature = "no-panic", inline)] -pub fn mul_pow5_div_pow2(m: u32, i: u32, j: i32) -> u32 { - #[cfg(feature = "small")] - { - let pow5 = unsafe { d2s::compute_pow5(i) }; - mul_shift_32(m, pow5.1, j) - } - - #[cfg(not(feature = "small"))] - { - debug_assert!(i < d2s::DOUBLE_POW5_SPLIT.len() as u32); - unsafe { mul_shift_32(m, d2s::DOUBLE_POW5_SPLIT.get_unchecked(i as usize).1, j) } - } -} diff --git a/vendor/ryu/src/lib.rs b/vendor/ryu/src/lib.rs deleted file mode 100644 index cf3a732..0000000 --- a/vendor/ryu/src/lib.rs +++ /dev/null @@ -1,124 +0,0 @@ -//! [![github]](https://github.com/dtolnay/ryu) [![crates-io]](https://crates.io/crates/ryu) [![docs-rs]](https://docs.rs/ryu) -//! -//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github -//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust -//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs -//! -//!
-//! -//! Pure Rust implementation of Ryū, an algorithm to quickly convert floating -//! point numbers to decimal strings. -//! -//! The PLDI'18 paper [*Ryū: fast float-to-string conversion*][paper] by Ulf -//! Adams includes a complete correctness proof of the algorithm. The paper is -//! available under the creative commons CC-BY-SA license. -//! -//! This Rust implementation is a line-by-line port of Ulf Adams' implementation -//! in C, [https://github.com/ulfjack/ryu][upstream]. -//! -//! [paper]: https://dl.acm.org/citation.cfm?id=3192369 -//! [upstream]: https://github.com/ulfjack/ryu -//! -//! # Example -//! -//! ``` -//! fn main() { -//! let mut buffer = ryu::Buffer::new(); -//! let printed = buffer.format(1.234); -//! assert_eq!(printed, "1.234"); -//! } -//! ``` -//! -//! ## Performance (lower is better) -//! -//! ![performance](https://raw.githubusercontent.com/dtolnay/ryu/master/performance.png) -//! -//! You can run upstream's benchmarks with: -//! -//! ```console -//! $ git clone https://github.com/ulfjack/ryu c-ryu -//! $ cd c-ryu -//! $ bazel run -c opt //ryu/benchmark -//! ``` -//! -//! And the same benchmark against our implementation with: -//! -//! ```console -//! $ git clone https://github.com/dtolnay/ryu rust-ryu -//! $ cd rust-ryu -//! $ cargo run --example upstream_benchmark --release -//! ``` -//! -//! These benchmarks measure the average time to print a 32-bit float and average -//! time to print a 64-bit float, where the inputs are distributed as uniform random -//! bit patterns 32 and 64 bits wide. -//! -//! The upstream C code, the unsafe direct Rust port, and the safe pretty Rust API -//! all perform the same, taking around 21 nanoseconds to format a 32-bit float and -//! 31 nanoseconds to format a 64-bit float. -//! -//! There is also a Rust-specific benchmark comparing this implementation to the -//! standard library which you can run with: -//! -//! ```console -//! $ cargo bench -//! ``` -//! -//! The benchmark shows Ryū approximately 2-5x faster than the standard library -//! across a range of f32 and f64 inputs. Measurements are in nanoseconds per -//! iteration; smaller is better. -//! -//! ## Formatting -//! -//! This library tends to produce more human-readable output than the standard -//! library's to\_string, which never uses scientific notation. Here are two -//! examples: -//! -//! - *ryu:* 1.23e40, *std:* 12300000000000000000000000000000000000000 -//! - *ryu:* 1.23e-40, *std:* 0.000000000000000000000000000000000000000123 -//! -//! Both libraries print short decimals such as 0.0000123 without scientific -//! notation. - -#![no_std] -#![doc(html_root_url = "https://docs.rs/ryu/1.0.16")] -#![allow( - clippy::cast_lossless, - clippy::cast_possible_truncation, - clippy::cast_possible_wrap, - clippy::cast_sign_loss, - clippy::checked_conversions, - clippy::doc_markdown, - clippy::expl_impl_clone_on_copy, - clippy::if_not_else, - clippy::many_single_char_names, - clippy::missing_panics_doc, - clippy::module_name_repetitions, - clippy::must_use_candidate, - clippy::needless_doctest_main, - clippy::similar_names, - clippy::too_many_lines, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix, - clippy::wildcard_imports -)] - -mod buffer; -mod common; -mod d2s; -#[cfg(not(feature = "small"))] -mod d2s_full_table; -mod d2s_intrinsics; -#[cfg(feature = "small")] -mod d2s_small_table; -mod digit_table; -mod f2s; -mod f2s_intrinsics; -mod pretty; - -pub use crate::buffer::{Buffer, Float}; - -/// Unsafe functions that mirror the API of the C implementation of Ryū. -pub mod raw { - pub use crate::pretty::{format32, format64}; -} diff --git a/vendor/ryu/src/parse.rs b/vendor/ryu/src/parse.rs deleted file mode 100644 index 00f7983..0000000 --- a/vendor/ryu/src/parse.rs +++ /dev/null @@ -1,19 +0,0 @@ -use core::fmt::{self, Display}; - -#[derive(Copy, Clone, Debug)] -pub enum Error { - InputTooShort, - InputTooLong, - MalformedInput, -} - -impl Display for Error { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - let msg = match self { - Error::InputTooShort => "input too short", - Error::InputTooLong => "input too long", - Error::MalformedInput => "malformed input", - }; - formatter.write_str(msg) - } -} diff --git a/vendor/ryu/src/pretty/exponent.rs b/vendor/ryu/src/pretty/exponent.rs deleted file mode 100644 index b72add5..0000000 --- a/vendor/ryu/src/pretty/exponent.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::digit_table::*; -use core::ptr; - -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn write_exponent3(mut k: isize, mut result: *mut u8) -> usize { - let sign = k < 0; - if sign { - *result = b'-'; - result = result.offset(1); - k = -k; - } - - debug_assert!(k < 1000); - if k >= 100 { - *result = b'0' + (k / 100) as u8; - k %= 100; - let d = DIGIT_TABLE.as_ptr().offset(k * 2); - ptr::copy_nonoverlapping(d, result.offset(1), 2); - sign as usize + 3 - } else if k >= 10 { - let d = DIGIT_TABLE.as_ptr().offset(k * 2); - ptr::copy_nonoverlapping(d, result, 2); - sign as usize + 2 - } else { - *result = b'0' + k as u8; - sign as usize + 1 - } -} - -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn write_exponent2(mut k: isize, mut result: *mut u8) -> usize { - let sign = k < 0; - if sign { - *result = b'-'; - result = result.offset(1); - k = -k; - } - - debug_assert!(k < 100); - if k >= 10 { - let d = DIGIT_TABLE.as_ptr().offset(k * 2); - ptr::copy_nonoverlapping(d, result, 2); - sign as usize + 2 - } else { - *result = b'0' + k as u8; - sign as usize + 1 - } -} diff --git a/vendor/ryu/src/pretty/mantissa.rs b/vendor/ryu/src/pretty/mantissa.rs deleted file mode 100644 index 0149f5c..0000000 --- a/vendor/ryu/src/pretty/mantissa.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::digit_table::*; -use core::ptr; - -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn write_mantissa_long(mut output: u64, mut result: *mut u8) { - if (output >> 32) != 0 { - // One expensive 64-bit division. - let mut output2 = (output - 100_000_000 * (output / 100_000_000)) as u32; - output /= 100_000_000; - - let c = output2 % 10_000; - output2 /= 10_000; - let d = output2 % 10_000; - let c0 = (c % 100) << 1; - let c1 = (c / 100) << 1; - let d0 = (d % 100) << 1; - let d1 = (d / 100) << 1; - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c0 as isize), - result.offset(-2), - 2, - ); - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c1 as isize), - result.offset(-4), - 2, - ); - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(d0 as isize), - result.offset(-6), - 2, - ); - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(d1 as isize), - result.offset(-8), - 2, - ); - result = result.offset(-8); - } - write_mantissa(output as u32, result); -} - -#[cfg_attr(feature = "no-panic", inline)] -pub unsafe fn write_mantissa(mut output: u32, mut result: *mut u8) { - while output >= 10_000 { - let c = output - 10_000 * (output / 10_000); - output /= 10_000; - let c0 = (c % 100) << 1; - let c1 = (c / 100) << 1; - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c0 as isize), - result.offset(-2), - 2, - ); - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c1 as isize), - result.offset(-4), - 2, - ); - result = result.offset(-4); - } - if output >= 100 { - let c = (output % 100) << 1; - output /= 100; - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c as isize), - result.offset(-2), - 2, - ); - result = result.offset(-2); - } - if output >= 10 { - let c = output << 1; - ptr::copy_nonoverlapping( - DIGIT_TABLE.as_ptr().offset(c as isize), - result.offset(-2), - 2, - ); - } else { - *result.offset(-1) = b'0' + output as u8; - } -} diff --git a/vendor/ryu/src/pretty/mod.rs b/vendor/ryu/src/pretty/mod.rs deleted file mode 100644 index da49e86..0000000 --- a/vendor/ryu/src/pretty/mod.rs +++ /dev/null @@ -1,224 +0,0 @@ -mod exponent; -mod mantissa; - -use self::exponent::*; -use self::mantissa::*; -use crate::common; -use crate::d2s::{self, *}; -use crate::f2s::*; -use core::ptr; -#[cfg(feature = "no-panic")] -use no_panic::no_panic; - -/// Print f64 to the given buffer and return number of bytes written. -/// -/// At most 24 bytes will be written. -/// -/// ## Special cases -/// -/// This function **does not** check for NaN or infinity. If the input -/// number is not a finite float, the printed representation will be some -/// correctly formatted but unspecified numerical value. -/// -/// Please check [`is_finite`] yourself before calling this function, or -/// check [`is_nan`] and [`is_infinite`] and handle those cases yourself. -/// -/// [`is_finite`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_finite -/// [`is_nan`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_nan -/// [`is_infinite`]: https://doc.rust-lang.org/std/primitive.f64.html#method.is_infinite -/// -/// ## Safety -/// -/// The `result` pointer argument must point to sufficiently many writable bytes -/// to hold Ryū's representation of `f`. -/// -/// ## Example -/// -/// ``` -/// use std::{mem::MaybeUninit, slice, str}; -/// -/// let f = 1.234f64; -/// -/// unsafe { -/// let mut buffer = [MaybeUninit::::uninit(); 24]; -/// let len = ryu::raw::format64(f, buffer.as_mut_ptr() as *mut u8); -/// let slice = slice::from_raw_parts(buffer.as_ptr() as *const u8, len); -/// let print = str::from_utf8_unchecked(slice); -/// assert_eq!(print, "1.234"); -/// } -/// ``` -#[must_use] -#[cfg_attr(feature = "no-panic", no_panic)] -pub unsafe fn format64(f: f64, result: *mut u8) -> usize { - let bits = f.to_bits(); - let sign = ((bits >> (DOUBLE_MANTISSA_BITS + DOUBLE_EXPONENT_BITS)) & 1) != 0; - let ieee_mantissa = bits & ((1u64 << DOUBLE_MANTISSA_BITS) - 1); - let ieee_exponent = - (bits >> DOUBLE_MANTISSA_BITS) as u32 & ((1u32 << DOUBLE_EXPONENT_BITS) - 1); - - let mut index = 0isize; - if sign { - *result = b'-'; - index += 1; - } - - if ieee_exponent == 0 && ieee_mantissa == 0 { - ptr::copy_nonoverlapping(b"0.0".as_ptr(), result.offset(index), 3); - return sign as usize + 3; - } - - let v = d2d(ieee_mantissa, ieee_exponent); - - let length = d2s::decimal_length17(v.mantissa) as isize; - let k = v.exponent as isize; - let kk = length + k; // 10^(kk-1) <= v < 10^kk - debug_assert!(k >= -324); - - if 0 <= k && kk <= 16 { - // 1234e7 -> 12340000000.0 - write_mantissa_long(v.mantissa, result.offset(index + length)); - for i in length..kk { - *result.offset(index + i) = b'0'; - } - *result.offset(index + kk) = b'.'; - *result.offset(index + kk + 1) = b'0'; - index as usize + kk as usize + 2 - } else if 0 < kk && kk <= 16 { - // 1234e-2 -> 12.34 - write_mantissa_long(v.mantissa, result.offset(index + length + 1)); - ptr::copy(result.offset(index + 1), result.offset(index), kk as usize); - *result.offset(index + kk) = b'.'; - index as usize + length as usize + 1 - } else if -5 < kk && kk <= 0 { - // 1234e-6 -> 0.001234 - *result.offset(index) = b'0'; - *result.offset(index + 1) = b'.'; - let offset = 2 - kk; - for i in 2..offset { - *result.offset(index + i) = b'0'; - } - write_mantissa_long(v.mantissa, result.offset(index + length + offset)); - index as usize + length as usize + offset as usize - } else if length == 1 { - // 1e30 - *result.offset(index) = b'0' + v.mantissa as u8; - *result.offset(index + 1) = b'e'; - index as usize + 2 + write_exponent3(kk - 1, result.offset(index + 2)) - } else { - // 1234e30 -> 1.234e33 - write_mantissa_long(v.mantissa, result.offset(index + length + 1)); - *result.offset(index) = *result.offset(index + 1); - *result.offset(index + 1) = b'.'; - *result.offset(index + length + 1) = b'e'; - index as usize - + length as usize - + 2 - + write_exponent3(kk - 1, result.offset(index + length + 2)) - } -} - -/// Print f32 to the given buffer and return number of bytes written. -/// -/// At most 16 bytes will be written. -/// -/// ## Special cases -/// -/// This function **does not** check for NaN or infinity. If the input -/// number is not a finite float, the printed representation will be some -/// correctly formatted but unspecified numerical value. -/// -/// Please check [`is_finite`] yourself before calling this function, or -/// check [`is_nan`] and [`is_infinite`] and handle those cases yourself. -/// -/// [`is_finite`]: https://doc.rust-lang.org/std/primitive.f32.html#method.is_finite -/// [`is_nan`]: https://doc.rust-lang.org/std/primitive.f32.html#method.is_nan -/// [`is_infinite`]: https://doc.rust-lang.org/std/primitive.f32.html#method.is_infinite -/// -/// ## Safety -/// -/// The `result` pointer argument must point to sufficiently many writable bytes -/// to hold Ryū's representation of `f`. -/// -/// ## Example -/// -/// ``` -/// use std::{mem::MaybeUninit, slice, str}; -/// -/// let f = 1.234f32; -/// -/// unsafe { -/// let mut buffer = [MaybeUninit::::uninit(); 16]; -/// let len = ryu::raw::format32(f, buffer.as_mut_ptr() as *mut u8); -/// let slice = slice::from_raw_parts(buffer.as_ptr() as *const u8, len); -/// let print = str::from_utf8_unchecked(slice); -/// assert_eq!(print, "1.234"); -/// } -/// ``` -#[must_use] -#[cfg_attr(feature = "no-panic", no_panic)] -pub unsafe fn format32(f: f32, result: *mut u8) -> usize { - let bits = f.to_bits(); - let sign = ((bits >> (FLOAT_MANTISSA_BITS + FLOAT_EXPONENT_BITS)) & 1) != 0; - let ieee_mantissa = bits & ((1u32 << FLOAT_MANTISSA_BITS) - 1); - let ieee_exponent = (bits >> FLOAT_MANTISSA_BITS) & ((1u32 << FLOAT_EXPONENT_BITS) - 1); - - let mut index = 0isize; - if sign { - *result = b'-'; - index += 1; - } - - if ieee_exponent == 0 && ieee_mantissa == 0 { - ptr::copy_nonoverlapping(b"0.0".as_ptr(), result.offset(index), 3); - return sign as usize + 3; - } - - let v = f2d(ieee_mantissa, ieee_exponent); - - let length = common::decimal_length9(v.mantissa) as isize; - let k = v.exponent as isize; - let kk = length + k; // 10^(kk-1) <= v < 10^kk - debug_assert!(k >= -45); - - if 0 <= k && kk <= 13 { - // 1234e7 -> 12340000000.0 - write_mantissa(v.mantissa, result.offset(index + length)); - for i in length..kk { - *result.offset(index + i) = b'0'; - } - *result.offset(index + kk) = b'.'; - *result.offset(index + kk + 1) = b'0'; - index as usize + kk as usize + 2 - } else if 0 < kk && kk <= 13 { - // 1234e-2 -> 12.34 - write_mantissa(v.mantissa, result.offset(index + length + 1)); - ptr::copy(result.offset(index + 1), result.offset(index), kk as usize); - *result.offset(index + kk) = b'.'; - index as usize + length as usize + 1 - } else if -6 < kk && kk <= 0 { - // 1234e-6 -> 0.001234 - *result.offset(index) = b'0'; - *result.offset(index + 1) = b'.'; - let offset = 2 - kk; - for i in 2..offset { - *result.offset(index + i) = b'0'; - } - write_mantissa(v.mantissa, result.offset(index + length + offset)); - index as usize + length as usize + offset as usize - } else if length == 1 { - // 1e30 - *result.offset(index) = b'0' + v.mantissa as u8; - *result.offset(index + 1) = b'e'; - index as usize + 2 + write_exponent2(kk - 1, result.offset(index + 2)) - } else { - // 1234e30 -> 1.234e33 - write_mantissa(v.mantissa, result.offset(index + length + 1)); - *result.offset(index) = *result.offset(index + 1); - *result.offset(index + 1) = b'.'; - *result.offset(index + length + 1) = b'e'; - index as usize - + length as usize - + 2 - + write_exponent2(kk - 1, result.offset(index + length + 2)) - } -} diff --git a/vendor/ryu/src/s2d.rs b/vendor/ryu/src/s2d.rs deleted file mode 100644 index 152ca97..0000000 --- a/vendor/ryu/src/s2d.rs +++ /dev/null @@ -1,217 +0,0 @@ -use crate::common::*; -use crate::d2s; -use crate::d2s_intrinsics::*; -use crate::parse::Error; -#[cfg(feature = "no-panic")] -use no_panic::no_panic; - -const DOUBLE_EXPONENT_BIAS: usize = 1023; - -fn floor_log2(value: u64) -> u32 { - 63_u32.wrapping_sub(value.leading_zeros()) -} - -#[cfg_attr(feature = "no-panic", no_panic)] -pub fn s2d(buffer: &[u8]) -> Result { - let len = buffer.len(); - if len == 0 { - return Err(Error::InputTooShort); - } - - let mut m10digits = 0; - let mut e10digits = 0; - let mut dot_index = len; - let mut e_index = len; - let mut m10 = 0u64; - let mut e10 = 0i32; - let mut signed_m = false; - let mut signed_e = false; - - let mut i = 0; - if unsafe { *buffer.get_unchecked(0) } == b'-' { - signed_m = true; - i += 1; - } - - while let Some(c) = buffer.get(i).copied() { - if c == b'.' { - if dot_index != len { - return Err(Error::MalformedInput); - } - dot_index = i; - i += 1; - continue; - } - if c < b'0' || c > b'9' { - break; - } - if m10digits >= 17 { - return Err(Error::InputTooLong); - } - m10 = 10 * m10 + (c - b'0') as u64; - if m10 != 0 { - m10digits += 1; - } - i += 1; - } - - if let Some(b'e') | Some(b'E') = buffer.get(i) { - e_index = i; - i += 1; - match buffer.get(i) { - Some(b'-') => { - signed_e = true; - i += 1; - } - Some(b'+') => i += 1, - _ => {} - } - while let Some(c) = buffer.get(i).copied() { - if c < b'0' || c > b'9' { - return Err(Error::MalformedInput); - } - if e10digits > 3 { - // TODO: Be more lenient. Return +/-Infinity or +/-0 instead. - return Err(Error::InputTooLong); - } - e10 = 10 * e10 + (c - b'0') as i32; - if e10 != 0 { - e10digits += 1; - } - i += 1; - } - } - - if i < len { - return Err(Error::MalformedInput); - } - if signed_e { - e10 = -e10; - } - e10 -= if dot_index < e_index { - (e_index - dot_index - 1) as i32 - } else { - 0 - }; - if m10 == 0 { - return Ok(if signed_m { -0.0 } else { 0.0 }); - } - - if m10digits + e10 <= -324 || m10 == 0 { - // Number is less than 1e-324, which should be rounded down to 0; return - // +/-0.0. - let ieee = (signed_m as u64) << (d2s::DOUBLE_EXPONENT_BITS + d2s::DOUBLE_MANTISSA_BITS); - return Ok(f64::from_bits(ieee)); - } - if m10digits + e10 >= 310 { - // Number is larger than 1e+309, which should be rounded to +/-Infinity. - let ieee = ((signed_m as u64) << (d2s::DOUBLE_EXPONENT_BITS + d2s::DOUBLE_MANTISSA_BITS)) - | (0x7ff_u64 << d2s::DOUBLE_MANTISSA_BITS); - return Ok(f64::from_bits(ieee)); - } - - // Convert to binary float m2 * 2^e2, while retaining information about - // whether the conversion was exact (trailing_zeros). - let e2: i32; - let m2: u64; - let mut trailing_zeros: bool; - if e10 >= 0 { - // The length of m * 10^e in bits is: - // log2(m10 * 10^e10) = log2(m10) + e10 log2(10) = log2(m10) + e10 + e10 * log2(5) - // - // We want to compute the DOUBLE_MANTISSA_BITS + 1 top-most bits (+1 for - // the implicit leading one in IEEE format). We therefore choose a - // binary output exponent of - // log2(m10 * 10^e10) - (DOUBLE_MANTISSA_BITS + 1). - // - // We use floor(log2(5^e10)) so that we get at least this many bits; - // better to have an additional bit than to not have enough bits. - e2 = floor_log2(m10) - .wrapping_add(e10 as u32) - .wrapping_add(log2_pow5(e10) as u32) - .wrapping_sub(d2s::DOUBLE_MANTISSA_BITS + 1) as i32; - - // We now compute [m10 * 10^e10 / 2^e2] = [m10 * 5^e10 / 2^(e2-e10)]. - // To that end, we use the DOUBLE_POW5_SPLIT table. - let j = e2 - .wrapping_sub(e10) - .wrapping_sub(ceil_log2_pow5(e10)) - .wrapping_add(d2s::DOUBLE_POW5_BITCOUNT); - debug_assert!(j >= 0); - debug_assert!(e10 < d2s::DOUBLE_POW5_SPLIT.len() as i32); - m2 = mul_shift_64( - m10, - unsafe { d2s::DOUBLE_POW5_SPLIT.get_unchecked(e10 as usize) }, - j as u32, - ); - - // We also compute if the result is exact, i.e., - // [m10 * 10^e10 / 2^e2] == m10 * 10^e10 / 2^e2. - // This can only be the case if 2^e2 divides m10 * 10^e10, which in turn - // requires that the largest power of 2 that divides m10 + e10 is - // greater than e2. If e2 is less than e10, then the result must be - // exact. Otherwise we use the existing multiple_of_power_of_2 function. - trailing_zeros = - e2 < e10 || e2 - e10 < 64 && multiple_of_power_of_2(m10, (e2 - e10) as u32); - } else { - e2 = floor_log2(m10) - .wrapping_add(e10 as u32) - .wrapping_sub(ceil_log2_pow5(-e10) as u32) - .wrapping_sub(d2s::DOUBLE_MANTISSA_BITS + 1) as i32; - let j = e2 - .wrapping_sub(e10) - .wrapping_add(ceil_log2_pow5(-e10)) - .wrapping_sub(1) - .wrapping_add(d2s::DOUBLE_POW5_INV_BITCOUNT); - debug_assert!(-e10 < d2s::DOUBLE_POW5_INV_SPLIT.len() as i32); - m2 = mul_shift_64( - m10, - unsafe { d2s::DOUBLE_POW5_INV_SPLIT.get_unchecked(-e10 as usize) }, - j as u32, - ); - trailing_zeros = multiple_of_power_of_5(m10, -e10 as u32); - } - - // Compute the final IEEE exponent. - let mut ieee_e2 = i32::max(0, e2 + DOUBLE_EXPONENT_BIAS as i32 + floor_log2(m2) as i32) as u32; - - if ieee_e2 > 0x7fe { - // Final IEEE exponent is larger than the maximum representable; return +/-Infinity. - let ieee = ((signed_m as u64) << (d2s::DOUBLE_EXPONENT_BITS + d2s::DOUBLE_MANTISSA_BITS)) - | (0x7ff_u64 << d2s::DOUBLE_MANTISSA_BITS); - return Ok(f64::from_bits(ieee)); - } - - // We need to figure out how much we need to shift m2. The tricky part is - // that we need to take the final IEEE exponent into account, so we need to - // reverse the bias and also special-case the value 0. - let shift = if ieee_e2 == 0 { 1 } else { ieee_e2 as i32 } - .wrapping_sub(e2) - .wrapping_sub(DOUBLE_EXPONENT_BIAS as i32) - .wrapping_sub(d2s::DOUBLE_MANTISSA_BITS as i32); - debug_assert!(shift >= 0); - - // We need to round up if the exact value is more than 0.5 above the value - // we computed. That's equivalent to checking if the last removed bit was 1 - // and either the value was not just trailing zeros or the result would - // otherwise be odd. - // - // We need to update trailing_zeros given that we have the exact output - // exponent ieee_e2 now. - trailing_zeros &= (m2 & ((1_u64 << (shift - 1)) - 1)) == 0; - let last_removed_bit = (m2 >> (shift - 1)) & 1; - let round_up = last_removed_bit != 0 && (!trailing_zeros || ((m2 >> shift) & 1) != 0); - - let mut ieee_m2 = (m2 >> shift).wrapping_add(round_up as u64); - debug_assert!(ieee_m2 <= 1_u64 << (d2s::DOUBLE_MANTISSA_BITS + 1)); - ieee_m2 &= (1_u64 << d2s::DOUBLE_MANTISSA_BITS) - 1; - if ieee_m2 == 0 && round_up { - // Due to how the IEEE represents +/-Infinity, we don't need to check - // for overflow here. - ieee_e2 += 1; - } - let ieee = ((((signed_m as u64) << d2s::DOUBLE_EXPONENT_BITS) | ieee_e2 as u64) - << d2s::DOUBLE_MANTISSA_BITS) - | ieee_m2; - Ok(f64::from_bits(ieee)) -} diff --git a/vendor/ryu/src/s2f.rs b/vendor/ryu/src/s2f.rs deleted file mode 100644 index 9593528..0000000 --- a/vendor/ryu/src/s2f.rs +++ /dev/null @@ -1,227 +0,0 @@ -use crate::common::*; -use crate::f2s; -use crate::f2s_intrinsics::*; -use crate::parse::Error; -#[cfg(feature = "no-panic")] -use no_panic::no_panic; - -const FLOAT_EXPONENT_BIAS: usize = 127; - -fn floor_log2(value: u32) -> u32 { - 31_u32.wrapping_sub(value.leading_zeros()) -} - -#[cfg_attr(feature = "no-panic", no_panic)] -pub fn s2f(buffer: &[u8]) -> Result { - let len = buffer.len(); - if len == 0 { - return Err(Error::InputTooShort); - } - - let mut m10digits = 0; - let mut e10digits = 0; - let mut dot_index = len; - let mut e_index = len; - let mut m10 = 0u32; - let mut e10 = 0i32; - let mut signed_m = false; - let mut signed_e = false; - - let mut i = 0; - if unsafe { *buffer.get_unchecked(0) } == b'-' { - signed_m = true; - i += 1; - } - - while let Some(c) = buffer.get(i).copied() { - if c == b'.' { - if dot_index != len { - return Err(Error::MalformedInput); - } - dot_index = i; - i += 1; - continue; - } - if c < b'0' || c > b'9' { - break; - } - if m10digits >= 9 { - return Err(Error::InputTooLong); - } - m10 = 10 * m10 + (c - b'0') as u32; - if m10 != 0 { - m10digits += 1; - } - i += 1; - } - - if let Some(b'e') | Some(b'E') = buffer.get(i) { - e_index = i; - i += 1; - match buffer.get(i) { - Some(b'-') => { - signed_e = true; - i += 1; - } - Some(b'+') => i += 1, - _ => {} - } - while let Some(c) = buffer.get(i).copied() { - if c < b'0' || c > b'9' { - return Err(Error::MalformedInput); - } - if e10digits > 3 { - // TODO: Be more lenient. Return +/-Infinity or +/-0 instead. - return Err(Error::InputTooLong); - } - e10 = 10 * e10 + (c - b'0') as i32; - if e10 != 0 { - e10digits += 1; - } - i += 1; - } - } - - if i < len { - return Err(Error::MalformedInput); - } - if signed_e { - e10 = -e10; - } - e10 -= if dot_index < e_index { - (e_index - dot_index - 1) as i32 - } else { - 0 - }; - if m10 == 0 { - return Ok(if signed_m { -0.0 } else { 0.0 }); - } - - if m10digits + e10 <= -46 || m10 == 0 { - // Number is less than 1e-46, which should be rounded down to 0; return - // +/-0.0. - let ieee = (signed_m as u32) << (f2s::FLOAT_EXPONENT_BITS + f2s::FLOAT_MANTISSA_BITS); - return Ok(f32::from_bits(ieee)); - } - if m10digits + e10 >= 40 { - // Number is larger than 1e+39, which should be rounded to +/-Infinity. - let ieee = ((signed_m as u32) << (f2s::FLOAT_EXPONENT_BITS + f2s::FLOAT_MANTISSA_BITS)) - | (0xff_u32 << f2s::FLOAT_MANTISSA_BITS); - return Ok(f32::from_bits(ieee)); - } - - // Convert to binary float m2 * 2^e2, while retaining information about - // whether the conversion was exact (trailing_zeros). - let e2: i32; - let m2: u32; - let mut trailing_zeros: bool; - if e10 >= 0 { - // The length of m * 10^e in bits is: - // log2(m10 * 10^e10) = log2(m10) + e10 log2(10) = log2(m10) + e10 + e10 * log2(5) - // - // We want to compute the FLOAT_MANTISSA_BITS + 1 top-most bits (+1 for - // the implicit leading one in IEEE format). We therefore choose a - // binary output exponent of - // log2(m10 * 10^e10) - (FLOAT_MANTISSA_BITS + 1). - // - // We use floor(log2(5^e10)) so that we get at least this many bits; better to - // have an additional bit than to not have enough bits. - e2 = floor_log2(m10) - .wrapping_add(e10 as u32) - .wrapping_add(log2_pow5(e10) as u32) - .wrapping_sub(f2s::FLOAT_MANTISSA_BITS + 1) as i32; - - // We now compute [m10 * 10^e10 / 2^e2] = [m10 * 5^e10 / 2^(e2-e10)]. - // To that end, we use the FLOAT_POW5_SPLIT table. - let j = e2 - .wrapping_sub(e10) - .wrapping_sub(ceil_log2_pow5(e10)) - .wrapping_add(f2s::FLOAT_POW5_BITCOUNT); - debug_assert!(j >= 0); - m2 = mul_pow5_div_pow2(m10, e10 as u32, j); - - // We also compute if the result is exact, i.e., - // [m10 * 10^e10 / 2^e2] == m10 * 10^e10 / 2^e2. - // This can only be the case if 2^e2 divides m10 * 10^e10, which in turn - // requires that the largest power of 2 that divides m10 + e10 is - // greater than e2. If e2 is less than e10, then the result must be - // exact. Otherwise we use the existing multiple_of_power_of_2 function. - trailing_zeros = - e2 < e10 || e2 - e10 < 32 && multiple_of_power_of_2_32(m10, (e2 - e10) as u32); - } else { - e2 = floor_log2(m10) - .wrapping_add(e10 as u32) - .wrapping_sub(ceil_log2_pow5(-e10) as u32) - .wrapping_sub(f2s::FLOAT_MANTISSA_BITS + 1) as i32; - - // We now compute [m10 * 10^e10 / 2^e2] = [m10 / (5^(-e10) 2^(e2-e10))]. - let j = e2 - .wrapping_sub(e10) - .wrapping_add(ceil_log2_pow5(-e10)) - .wrapping_sub(1) - .wrapping_add(f2s::FLOAT_POW5_INV_BITCOUNT); - m2 = mul_pow5_inv_div_pow2(m10, -e10 as u32, j); - - // We also compute if the result is exact, i.e., - // [m10 / (5^(-e10) 2^(e2-e10))] == m10 / (5^(-e10) 2^(e2-e10)) - // - // If e2-e10 >= 0, we need to check whether (5^(-e10) 2^(e2-e10)) - // divides m10, which is the case iff pow5(m10) >= -e10 AND pow2(m10) >= - // e2-e10. - // - // If e2-e10 < 0, we have actually computed [m10 * 2^(e10 e2) / - // 5^(-e10)] above, and we need to check whether 5^(-e10) divides (m10 * - // 2^(e10-e2)), which is the case iff pow5(m10 * 2^(e10-e2)) = pow5(m10) - // >= -e10. - trailing_zeros = (e2 < e10 - || (e2 - e10 < 32 && multiple_of_power_of_2_32(m10, (e2 - e10) as u32))) - && multiple_of_power_of_5_32(m10, -e10 as u32); - } - - // Compute the final IEEE exponent. - let mut ieee_e2 = i32::max(0, e2 + FLOAT_EXPONENT_BIAS as i32 + floor_log2(m2) as i32) as u32; - - if ieee_e2 > 0xfe { - // Final IEEE exponent is larger than the maximum representable; return - // +/-Infinity. - let ieee = ((signed_m as u32) << (f2s::FLOAT_EXPONENT_BITS + f2s::FLOAT_MANTISSA_BITS)) - | (0xff_u32 << f2s::FLOAT_MANTISSA_BITS); - return Ok(f32::from_bits(ieee)); - } - - // We need to figure out how much we need to shift m2. The tricky part is - // that we need to take the final IEEE exponent into account, so we need to - // reverse the bias and also special-case the value 0. - let shift = if ieee_e2 == 0 { 1 } else { ieee_e2 as i32 } - .wrapping_sub(e2) - .wrapping_sub(FLOAT_EXPONENT_BIAS as i32) - .wrapping_sub(f2s::FLOAT_MANTISSA_BITS as i32); - debug_assert!(shift >= 0); - - // We need to round up if the exact value is more than 0.5 above the value - // we computed. That's equivalent to checking if the last removed bit was 1 - // and either the value was not just trailing zeros or the result would - // otherwise be odd. - // - // We need to update trailing_zeros given that we have the exact output - // exponent ieee_e2 now. - trailing_zeros &= (m2 & ((1_u32 << (shift - 1)) - 1)) == 0; - let last_removed_bit = (m2 >> (shift - 1)) & 1; - let round_up = last_removed_bit != 0 && (!trailing_zeros || ((m2 >> shift) & 1) != 0); - - let mut ieee_m2 = (m2 >> shift).wrapping_add(round_up as u32); - debug_assert!(ieee_m2 <= 1_u32 << (f2s::FLOAT_MANTISSA_BITS + 1)); - ieee_m2 &= (1_u32 << f2s::FLOAT_MANTISSA_BITS) - 1; - if ieee_m2 == 0 && round_up { - // Rounding up may overflow the mantissa. - // In this case we move a trailing zero of the mantissa into the - // exponent. - // Due to how the IEEE represents +/-Infinity, we don't need to check - // for overflow here. - ieee_e2 += 1; - } - let ieee = ((((signed_m as u32) << f2s::FLOAT_EXPONENT_BITS) | ieee_e2) - << f2s::FLOAT_MANTISSA_BITS) - | ieee_m2; - Ok(f32::from_bits(ieee)) -} diff --git a/vendor/ryu/tests/common_test.rs b/vendor/ryu/tests/common_test.rs deleted file mode 100644 index 2f05b33..0000000 --- a/vendor/ryu/tests/common_test.rs +++ /dev/null @@ -1,91 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow(dead_code)] -#![allow( - clippy::approx_constant, - clippy::cast_possible_wrap, - clippy::cast_sign_loss, - clippy::excessive_precision, - clippy::unreadable_literal, - clippy::wildcard_imports -)] - -#[path = "../src/common.rs"] -mod common; - -use common::*; - -#[test] -fn test_decimal_length9() { - assert_eq!(1, decimal_length9(0)); - assert_eq!(1, decimal_length9(1)); - assert_eq!(1, decimal_length9(9)); - assert_eq!(2, decimal_length9(10)); - assert_eq!(2, decimal_length9(99)); - assert_eq!(3, decimal_length9(100)); - assert_eq!(3, decimal_length9(999)); - assert_eq!(9, decimal_length9(999999999)); -} - -#[test] -fn test_ceil_log2_pow5() { - assert_eq!(1, ceil_log2_pow5(0)); - assert_eq!(3, ceil_log2_pow5(1)); - assert_eq!(5, ceil_log2_pow5(2)); - assert_eq!(7, ceil_log2_pow5(3)); - assert_eq!(10, ceil_log2_pow5(4)); - assert_eq!(8192, ceil_log2_pow5(3528)); -} - -#[test] -fn test_log10_pow2() { - assert_eq!(0, log10_pow2(0)); - assert_eq!(0, log10_pow2(1)); - assert_eq!(0, log10_pow2(2)); - assert_eq!(0, log10_pow2(3)); - assert_eq!(1, log10_pow2(4)); - assert_eq!(496, log10_pow2(1650)); -} - -#[test] -fn test_log10_pow5() { - assert_eq!(0, log10_pow5(0)); - assert_eq!(0, log10_pow5(1)); - assert_eq!(1, log10_pow5(2)); - assert_eq!(2, log10_pow5(3)); - assert_eq!(2, log10_pow5(4)); - assert_eq!(1831, log10_pow5(2620)); -} - -#[test] -fn test_float_to_bits() { - assert_eq!(0, 0.0_f32.to_bits()); - assert_eq!(0x40490fda, 3.1415926_f32.to_bits()); -} - -#[test] -fn test_double_to_bits() { - assert_eq!(0, 0.0_f64.to_bits()); - assert_eq!( - 0x400921FB54442D18, - 3.1415926535897932384626433_f64.to_bits(), - ); -} diff --git a/vendor/ryu/tests/d2s_intrinsics_test.rs b/vendor/ryu/tests/d2s_intrinsics_test.rs deleted file mode 100644 index 0ac80c9..0000000 --- a/vendor/ryu/tests/d2s_intrinsics_test.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow(dead_code)] -#![allow( - clippy::cast_lossless, - clippy::cast_possible_truncation, - clippy::unreadable_literal -)] - -#[path = "../src/d2s_intrinsics.rs"] -mod d2s_intrinsics; - -use d2s_intrinsics::pow5_factor; - -#[test] -fn test_pow5_factor() { - assert_eq!(0, pow5_factor(1)); - assert_eq!(0, pow5_factor(2)); - assert_eq!(0, pow5_factor(3)); - assert_eq!(0, pow5_factor(4)); - assert_eq!(1, pow5_factor(5)); - assert_eq!(0, pow5_factor(6)); - assert_eq!(0, pow5_factor(7)); - assert_eq!(0, pow5_factor(8)); - assert_eq!(0, pow5_factor(9)); - assert_eq!(1, pow5_factor(10)); - - assert_eq!(0, pow5_factor(12)); - assert_eq!(0, pow5_factor(14)); - assert_eq!(0, pow5_factor(16)); - assert_eq!(0, pow5_factor(18)); - assert_eq!(1, pow5_factor(20)); - - assert_eq!(2, pow5_factor(5 * 5)); - assert_eq!(3, pow5_factor(5 * 5 * 5)); - assert_eq!(4, pow5_factor(5 * 5 * 5 * 5)); - assert_eq!(5, pow5_factor(5 * 5 * 5 * 5 * 5)); - assert_eq!(6, pow5_factor(5 * 5 * 5 * 5 * 5 * 5)); - assert_eq!(7, pow5_factor(5 * 5 * 5 * 5 * 5 * 5 * 5)); - assert_eq!(8, pow5_factor(5 * 5 * 5 * 5 * 5 * 5 * 5 * 5)); - assert_eq!(9, pow5_factor(5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5)); - assert_eq!(10, pow5_factor(5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5)); - - assert_eq!(0, pow5_factor(42)); - assert_eq!(1, pow5_factor(42 * 5)); - assert_eq!(2, pow5_factor(42 * 5 * 5)); - assert_eq!(3, pow5_factor(42 * 5 * 5 * 5)); - assert_eq!(4, pow5_factor(42 * 5 * 5 * 5 * 5)); - assert_eq!(5, pow5_factor(42 * 5 * 5 * 5 * 5 * 5)); - - assert_eq!(27, pow5_factor(7450580596923828125)); // 5^27, largest power of 5 < 2^64. - assert_eq!(1, pow5_factor(18446744073709551615)); // 2^64 - 1, largest multiple of 5 < 2^64. - assert_eq!(0, pow5_factor(18446744073709551614)); // 2^64 - 2, largest non-multiple of 5 < 2^64. -} diff --git a/vendor/ryu/tests/d2s_table_test.rs b/vendor/ryu/tests/d2s_table_test.rs deleted file mode 100644 index dce1be3..0000000 --- a/vendor/ryu/tests/d2s_table_test.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow(dead_code)] -#![allow( - clippy::cast_lossless, - clippy::cast_possible_truncation, - clippy::cast_possible_wrap, - clippy::cast_sign_loss, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix, - clippy::wildcard_imports -)] - -#[path = "../src/common.rs"] -mod common; - -#[path = "../src/d2s_full_table.rs"] -mod d2s_full_table; - -#[path = "../src/d2s_intrinsics.rs"] -mod d2s_intrinsics; - -#[path = "../src/d2s_small_table.rs"] -mod d2s_small_table; - -use d2s_full_table::*; -use d2s_small_table::*; - -#[test] -fn test_compute_pow5() { - for (i, entry) in DOUBLE_POW5_SPLIT.iter().enumerate() { - assert_eq!(*entry, unsafe { compute_pow5(i as u32) }, "entry {}", i); - } -} - -#[test] -fn test_compute_inv_pow5() { - for (i, entry) in DOUBLE_POW5_INV_SPLIT[..292].iter().enumerate() { - assert_eq!(*entry, unsafe { compute_inv_pow5(i as u32) }, "entry {}", i); - } -} diff --git a/vendor/ryu/tests/d2s_test.rs b/vendor/ryu/tests/d2s_test.rs deleted file mode 100644 index 7e8eba6..0000000 --- a/vendor/ryu/tests/d2s_test.rs +++ /dev/null @@ -1,331 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow( - clippy::approx_constant, - clippy::cast_lossless, - clippy::float_cmp, - clippy::int_plus_one, - clippy::non_ascii_literal, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix -)] - -#[macro_use] -mod macros; - -use std::f64; - -fn pretty(f: f64) -> String { - ryu::Buffer::new().format(f).to_owned() -} - -fn ieee_parts_to_double(sign: bool, ieee_exponent: u32, ieee_mantissa: u64) -> f64 { - assert!(ieee_exponent <= 2047); - assert!(ieee_mantissa <= (1u64 << 53) - 1); - f64::from_bits(((sign as u64) << 63) | ((ieee_exponent as u64) << 52) | ieee_mantissa) -} - -#[test] -fn test_ryu() { - check!(0.3); - check!(1234000000000000.0); - check!(1.234e16); - check!(2.71828); - check!(1.1e128); - check!(1.1e-64); - check!(2.718281828459045); - check!(5e-324); - check!(1.7976931348623157e308); -} - -#[test] -fn test_random() { - let n = if cfg!(miri) { 100 } else { 1000000 }; - let mut buffer = ryu::Buffer::new(); - for _ in 0..n { - let f: f64 = rand::random(); - assert_eq!(f, buffer.format_finite(f).parse().unwrap()); - } -} - -#[test] -#[cfg_attr(miri, ignore)] -fn test_non_finite() { - for i in 0u64..1 << 23 { - let f = f64::from_bits((((1 << 11) - 1) << 52) + (i << 29)); - assert!(!f.is_finite(), "f={}", f); - ryu::Buffer::new().format_finite(f); - } -} - -#[test] -fn test_basic() { - check!(0.0); - check!(-0.0); - check!(1.0); - check!(-1.0); - assert_eq!(pretty(f64::NAN.copysign(1.0)), "NaN"); - assert_eq!(pretty(f64::NAN.copysign(-1.0)), "NaN"); - assert_eq!(pretty(f64::INFINITY), "inf"); - assert_eq!(pretty(f64::NEG_INFINITY), "-inf"); -} - -#[test] -fn test_switch_to_subnormal() { - check!(2.2250738585072014e-308); -} - -#[test] -fn test_min_and_max() { - assert_eq!(f64::from_bits(0x7fefffffffffffff), 1.7976931348623157e308); - check!(1.7976931348623157e308); - assert_eq!(f64::from_bits(1), 5e-324); - check!(5e-324); -} - -#[test] -fn test_lots_of_trailing_zeros() { - check!(2.9802322387695312e-8); -} - -#[test] -fn test_regression() { - check!(-2.109808898695963e16); - check!(4.940656e-318); - check!(1.18575755e-316); - check!(2.989102097996e-312); - check!(9060801153433600.0); - check!(4.708356024711512e18); - check!(9.409340012568248e18); - check!(1.2345678); -} - -#[test] -fn test_looks_like_pow5() { - // These numbers have a mantissa that is a multiple of the largest power of - // 5 that fits, and an exponent that causes the computation for q to result - // in 22, which is a corner case for Ryū. - assert_eq!(f64::from_bits(0x4830F0CF064DD592), 5.764607523034235e39); - check!(5.764607523034235e39); - assert_eq!(f64::from_bits(0x4840F0CF064DD592), 1.152921504606847e40); - check!(1.152921504606847e40); - assert_eq!(f64::from_bits(0x4850F0CF064DD592), 2.305843009213694e40); - check!(2.305843009213694e40); -} - -#[test] -fn test_output_length() { - check!(1.0); // already tested in Basic - check!(1.2); - check!(1.23); - check!(1.234); - check!(1.2345); - check!(1.23456); - check!(1.234567); - check!(1.2345678); // already tested in Regression - check!(1.23456789); - check!(1.234567895); // 1.234567890 would be trimmed - check!(1.2345678901); - check!(1.23456789012); - check!(1.234567890123); - check!(1.2345678901234); - check!(1.23456789012345); - check!(1.234567890123456); - check!(1.2345678901234567); - - // Test 32-bit chunking - check!(4.294967294); // 2^32 - 2 - check!(4.294967295); // 2^32 - 1 - check!(4.294967296); // 2^32 - check!(4.294967297); // 2^32 + 1 - check!(4.294967298); // 2^32 + 2 -} - -// Test min, max shift values in shiftright128 -#[test] -fn test_min_max_shift() { - let max_mantissa = (1u64 << 53) - 1; - - // 32-bit opt-size=0: 49 <= dist <= 50 - // 32-bit opt-size=1: 30 <= dist <= 50 - // 64-bit opt-size=0: 50 <= dist <= 50 - // 64-bit opt-size=1: 30 <= dist <= 50 - assert_eq!(1.7800590868057611E-307, ieee_parts_to_double(false, 4, 0)); - check!(1.7800590868057611e-307); - // 32-bit opt-size=0: 49 <= dist <= 49 - // 32-bit opt-size=1: 28 <= dist <= 49 - // 64-bit opt-size=0: 50 <= dist <= 50 - // 64-bit opt-size=1: 28 <= dist <= 50 - assert_eq!( - 2.8480945388892175E-306, - ieee_parts_to_double(false, 6, max_mantissa) - ); - check!(2.8480945388892175e-306); - // 32-bit opt-size=0: 52 <= dist <= 53 - // 32-bit opt-size=1: 2 <= dist <= 53 - // 64-bit opt-size=0: 53 <= dist <= 53 - // 64-bit opt-size=1: 2 <= dist <= 53 - assert_eq!(2.446494580089078E-296, ieee_parts_to_double(false, 41, 0)); - check!(2.446494580089078e-296); - // 32-bit opt-size=0: 52 <= dist <= 52 - // 32-bit opt-size=1: 2 <= dist <= 52 - // 64-bit opt-size=0: 53 <= dist <= 53 - // 64-bit opt-size=1: 2 <= dist <= 53 - assert_eq!( - 4.8929891601781557E-296, - ieee_parts_to_double(false, 40, max_mantissa) - ); - check!(4.8929891601781557e-296); - - // 32-bit opt-size=0: 57 <= dist <= 58 - // 32-bit opt-size=1: 57 <= dist <= 58 - // 64-bit opt-size=0: 58 <= dist <= 58 - // 64-bit opt-size=1: 58 <= dist <= 58 - assert_eq!(1.8014398509481984E16, ieee_parts_to_double(false, 1077, 0)); - check!(1.8014398509481984e16); - // 32-bit opt-size=0: 57 <= dist <= 57 - // 32-bit opt-size=1: 57 <= dist <= 57 - // 64-bit opt-size=0: 58 <= dist <= 58 - // 64-bit opt-size=1: 58 <= dist <= 58 - assert_eq!( - 3.6028797018963964E16, - ieee_parts_to_double(false, 1076, max_mantissa) - ); - check!(3.6028797018963964e16); - // 32-bit opt-size=0: 51 <= dist <= 52 - // 32-bit opt-size=1: 51 <= dist <= 59 - // 64-bit opt-size=0: 52 <= dist <= 52 - // 64-bit opt-size=1: 52 <= dist <= 59 - assert_eq!(2.900835519859558E-216, ieee_parts_to_double(false, 307, 0)); - check!(2.900835519859558e-216); - // 32-bit opt-size=0: 51 <= dist <= 51 - // 32-bit opt-size=1: 51 <= dist <= 59 - // 64-bit opt-size=0: 52 <= dist <= 52 - // 64-bit opt-size=1: 52 <= dist <= 59 - assert_eq!( - 5.801671039719115E-216, - ieee_parts_to_double(false, 306, max_mantissa) - ); - check!(5.801671039719115e-216); - - // https://github.com/ulfjack/ryu/commit/19e44d16d80236f5de25800f56d82606d1be00b9#commitcomment-30146483 - // 32-bit opt-size=0: 49 <= dist <= 49 - // 32-bit opt-size=1: 44 <= dist <= 49 - // 64-bit opt-size=0: 50 <= dist <= 50 - // 64-bit opt-size=1: 44 <= dist <= 50 - assert_eq!( - 3.196104012172126E-27, - ieee_parts_to_double(false, 934, 0x000FA7161A4D6E0C) - ); - check!(3.196104012172126e-27); -} - -#[test] -fn test_small_integers() { - check!(9007199254740991.0); // 2^53-1 - check!(9007199254740992.0); // 2^53 - - check!(1.0); - check!(12.0); - check!(123.0); - check!(1234.0); - check!(12345.0); - check!(123456.0); - check!(1234567.0); - check!(12345678.0); - check!(123456789.0); - check!(1234567890.0); - check!(1234567895.0); - check!(12345678901.0); - check!(123456789012.0); - check!(1234567890123.0); - check!(12345678901234.0); - check!(123456789012345.0); - check!(1234567890123456.0); - - // 10^i - check!(1.0); - check!(10.0); - check!(100.0); - check!(1000.0); - check!(10000.0); - check!(100000.0); - check!(1000000.0); - check!(10000000.0); - check!(100000000.0); - check!(1000000000.0); - check!(10000000000.0); - check!(100000000000.0); - check!(1000000000000.0); - check!(10000000000000.0); - check!(100000000000000.0); - check!(1000000000000000.0); - - // 10^15 + 10^i - check!(1000000000000001.0); - check!(1000000000000010.0); - check!(1000000000000100.0); - check!(1000000000001000.0); - check!(1000000000010000.0); - check!(1000000000100000.0); - check!(1000000001000000.0); - check!(1000000010000000.0); - check!(1000000100000000.0); - check!(1000001000000000.0); - check!(1000010000000000.0); - check!(1000100000000000.0); - check!(1001000000000000.0); - check!(1010000000000000.0); - check!(1100000000000000.0); - - // Largest power of 2 <= 10^(i+1) - check!(8.0); - check!(64.0); - check!(512.0); - check!(8192.0); - check!(65536.0); - check!(524288.0); - check!(8388608.0); - check!(67108864.0); - check!(536870912.0); - check!(8589934592.0); - check!(68719476736.0); - check!(549755813888.0); - check!(8796093022208.0); - check!(70368744177664.0); - check!(562949953421312.0); - check!(9007199254740992.0); - - // 1000 * (Largest power of 2 <= 10^(i+1)) - check!(8000.0); - check!(64000.0); - check!(512000.0); - check!(8192000.0); - check!(65536000.0); - check!(524288000.0); - check!(8388608000.0); - check!(67108864000.0); - check!(536870912000.0); - check!(8589934592000.0); - check!(68719476736000.0); - check!(549755813888000.0); - check!(8796093022208000.0); -} diff --git a/vendor/ryu/tests/exhaustive.rs b/vendor/ryu/tests/exhaustive.rs deleted file mode 100644 index 569bcff..0000000 --- a/vendor/ryu/tests/exhaustive.rs +++ /dev/null @@ -1,52 +0,0 @@ -#![cfg(exhaustive)] - -use std::str; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::thread; - -#[test] -fn test_exhaustive() { - const BATCH_SIZE: u32 = 1_000_000; - let counter = Arc::new(AtomicUsize::new(0)); - let finished = Arc::new(AtomicUsize::new(0)); - - let mut workers = Vec::new(); - for _ in 0..num_cpus::get() { - let counter = counter.clone(); - let finished = finished.clone(); - workers.push(thread::spawn(move || loop { - let batch = counter.fetch_add(1, Ordering::Relaxed) as u32; - if batch > u32::max_value() / BATCH_SIZE { - return; - } - - let min = batch * BATCH_SIZE; - let max = if batch == u32::max_value() / BATCH_SIZE { - u32::max_value() - } else { - min + BATCH_SIZE - 1 - }; - - let mut bytes = [0u8; 24]; - let mut buffer = ryu::Buffer::new(); - for u in min..=max { - let f = f32::from_bits(u); - if !f.is_finite() { - continue; - } - let n = unsafe { ryu::raw::format32(f, &mut bytes[0]) }; - assert_eq!(Ok(Ok(f)), str::from_utf8(&bytes[..n]).map(str::parse)); - assert_eq!(Ok(f), buffer.format_finite(f).parse()); - } - - let increment = (max - min + 1) as usize; - let update = finished.fetch_add(increment, Ordering::Relaxed); - println!("{}", update + increment); - })); - } - - for w in workers { - w.join().unwrap(); - } -} diff --git a/vendor/ryu/tests/f2s_test.rs b/vendor/ryu/tests/f2s_test.rs deleted file mode 100644 index d6249a3..0000000 --- a/vendor/ryu/tests/f2s_test.rs +++ /dev/null @@ -1,181 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow( - clippy::approx_constant, - clippy::float_cmp, - clippy::non_ascii_literal, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix -)] - -#[macro_use] -mod macros; - -use std::f32; - -fn pretty(f: f32) -> String { - ryu::Buffer::new().format(f).to_owned() -} - -#[test] -fn test_ryu() { - check!(0.3); - check!(1234000000000.0); - check!(1.234e13); - check!(2.71828); - check!(1.1e32); - check!(1.1e-32); - check!(2.7182817); - check!(1e-45); - check!(3.4028235e38); - check!(-0.001234); -} - -#[test] -fn test_random() { - let n = if cfg!(miri) { 100 } else { 1000000 }; - let mut buffer = ryu::Buffer::new(); - for _ in 0..n { - let f: f32 = rand::random(); - assert_eq!(f, buffer.format_finite(f).parse().unwrap()); - } -} - -#[test] -#[cfg_attr(miri, ignore)] -fn test_non_finite() { - for i in 0u32..1 << 23 { - let f = f32::from_bits((((1 << 8) - 1) << 23) + i); - assert!(!f.is_finite(), "f={}", f); - ryu::Buffer::new().format_finite(f); - } -} - -#[test] -fn test_basic() { - check!(0.0); - check!(-0.0); - check!(1.0); - check!(-1.0); - assert_eq!(pretty(f32::NAN.copysign(1.0)), "NaN"); - assert_eq!(pretty(f32::NAN.copysign(-1.0)), "NaN"); - assert_eq!(pretty(f32::INFINITY), "inf"); - assert_eq!(pretty(f32::NEG_INFINITY), "-inf"); -} - -#[test] -fn test_switch_to_subnormal() { - check!(1.1754944e-38); -} - -#[test] -fn test_min_and_max() { - assert_eq!(f32::from_bits(0x7f7fffff), 3.4028235e38); - check!(3.4028235e38); - assert_eq!(f32::from_bits(1), 1e-45); - check!(1e-45); -} - -// Check that we return the exact boundary if it is the shortest -// representation, but only if the original floating point number is even. -#[test] -fn test_boundary_round_even() { - check!(33554450.0); - check!(9000000000.0); - check!(34366720000.0); -} - -// If the exact value is exactly halfway between two shortest representations, -// then we round to even. It seems like this only makes a difference if the -// last two digits are ...2|5 or ...7|5, and we cut off the 5. -#[test] -fn test_exact_value_round_even() { - check!(305404.12); - check!(8099.0312); -} - -#[test] -fn test_lots_of_trailing_zeros() { - // Pattern for the first test: 00111001100000000000000000000000 - check!(0.00024414062); - check!(0.0024414062); - check!(0.0043945312); - check!(0.0063476562); -} - -#[test] -fn test_regression() { - check!(4.7223665e21); - check!(8388608.0); - check!(16777216.0); - check!(33554436.0); - check!(67131496.0); - check!(1.9310392e-38); - check!(-2.47e-43); - check!(1.993244e-38); - check!(4103.9004); - check!(5339999700.0); - check!(6.0898e-39); - check!(0.0010310042); - check!(2.882326e17); - check!(7.038531e-26); - check!(9.223404e17); - check!(67108870.0); - check!(1e-44); - check!(2.816025e14); - check!(9.223372e18); - check!(1.5846086e29); - check!(1.1811161e19); - check!(5.368709e18); - check!(4.6143166e18); - check!(0.007812537); - check!(1e-45); - check!(1.18697725e20); - check!(1.00014165e-36); - check!(200.0); - check!(33554432.0); -} - -#[test] -fn test_looks_like_pow5() { - // These numbers have a mantissa that is the largest power of 5 that fits, - // and an exponent that causes the computation for q to result in 10, which - // is a corner case for Ryū. - assert_eq!(f32::from_bits(0x5D1502F9), 6.7108864e17); - check!(6.7108864e17); - assert_eq!(f32::from_bits(0x5D9502F9), 1.3421773e18); - check!(1.3421773e18); - assert_eq!(f32::from_bits(0x5E1502F9), 2.6843546e18); - check!(2.6843546e18); -} - -#[test] -fn test_output_length() { - check!(1.0); // already tested in Basic - check!(1.2); - check!(1.23); - check!(1.234); - check!(1.2345); - check!(1.23456); - check!(1.234567); - check!(1.2345678); - check!(1.23456735e-36); -} diff --git a/vendor/ryu/tests/macros/mod.rs b/vendor/ryu/tests/macros/mod.rs deleted file mode 100644 index de6fb46..0000000 --- a/vendor/ryu/tests/macros/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -macro_rules! check { - ($f:tt) => { - assert_eq!(pretty($f), stringify!($f)); - }; - (-$f:tt) => { - assert_eq!(pretty(-$f), concat!("-", stringify!($f))); - }; -} diff --git a/vendor/ryu/tests/s2d_test.rs b/vendor/ryu/tests/s2d_test.rs deleted file mode 100644 index 7b42164..0000000 --- a/vendor/ryu/tests/s2d_test.rs +++ /dev/null @@ -1,167 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![cfg(not(feature = "small"))] -#![allow(dead_code)] -#![allow( - clippy::cast_lossless, - clippy::cast_possible_truncation, - clippy::cast_possible_wrap, - clippy::cast_sign_loss, - clippy::excessive_precision, - clippy::float_cmp, - clippy::manual_range_contains, - clippy::similar_names, - clippy::too_many_lines, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix, - clippy::wildcard_imports -)] - -#[path = "../src/common.rs"] -mod common; - -#[cfg(not(feature = "small"))] -#[path = "../src/d2s_full_table.rs"] -mod d2s_full_table; - -#[path = "../src/d2s_intrinsics.rs"] -mod d2s_intrinsics; - -#[cfg(feature = "small")] -#[path = "../src/d2s_small_table.rs"] -mod d2s_small_table; - -#[path = "../src/d2s.rs"] -mod d2s; - -#[path = "../src/s2d.rs"] -mod s2d; - -#[path = "../src/parse.rs"] -mod parse; - -use crate::parse::Error; -use crate::s2d::s2d; - -impl PartialEq for Error { - fn eq(&self, other: &Self) -> bool { - *self as u8 == *other as u8 - } -} - -#[test] -fn test_bad_input() { - assert_eq!(Error::MalformedInput, s2d(b"x").unwrap_err()); - assert_eq!(Error::MalformedInput, s2d(b"1..1").unwrap_err()); - assert_eq!(Error::MalformedInput, s2d(b"..").unwrap_err()); - assert_eq!(Error::MalformedInput, s2d(b"1..1").unwrap_err()); - assert_eq!(Error::MalformedInput, s2d(b"1ee1").unwrap_err()); - assert_eq!(Error::MalformedInput, s2d(b"1e.1").unwrap_err()); - assert_eq!(Error::InputTooShort, s2d(b"").unwrap_err()); - assert_eq!(Error::InputTooLong, s2d(b"123456789012345678").unwrap_err()); - assert_eq!(Error::InputTooLong, s2d(b"1e12345").unwrap_err()); -} - -#[test] -fn test_basic() { - assert_eq!(0.0, s2d(b"0").unwrap()); - assert_eq!(-0.0, s2d(b"-0").unwrap()); - assert_eq!(1.0, s2d(b"1").unwrap()); - assert_eq!(2.0, s2d(b"2").unwrap()); - assert_eq!(123456789.0, s2d(b"123456789").unwrap()); - assert_eq!(123.456, s2d(b"123.456").unwrap()); - assert_eq!(123.456, s2d(b"123456e-3").unwrap()); - assert_eq!(123.456, s2d(b"1234.56e-1").unwrap()); - assert_eq!(1.453, s2d(b"1.453").unwrap()); - assert_eq!(1453.0, s2d(b"1.453e+3").unwrap()); - assert_eq!(0.0, s2d(b".0").unwrap()); - assert_eq!(1.0, s2d(b"1e0").unwrap()); - assert_eq!(1.0, s2d(b"1E0").unwrap()); - assert_eq!(1.0, s2d(b"000001.000000").unwrap()); - assert_eq!(0.2316419, s2d(b"0.2316419").unwrap()); -} - -#[test] -fn test_min_max() { - assert_eq!( - 1.7976931348623157e308, - s2d(b"1.7976931348623157e308").unwrap(), - ); - assert_eq!(5E-324, s2d(b"5E-324").unwrap()); -} - -#[test] -fn test_mantissa_rounding_overflow() { - // This results in binary mantissa that is all ones and requires rounding up - // because it is closer to 1 than to the next smaller float. This is a - // regression test that the mantissa overflow is handled correctly by - // increasing the exponent. - assert_eq!(1.0, s2d(b"0.99999999999999999").unwrap()); - // This number overflows the mantissa *and* the IEEE exponent. - assert_eq!(f64::INFINITY, s2d(b"1.7976931348623159e308").unwrap()); -} - -#[test] -fn test_underflow() { - assert_eq!(0.0, s2d(b"2.4e-324").unwrap()); - assert_eq!(0.0, s2d(b"1e-324").unwrap()); - assert_eq!(0.0, s2d(b"9.99999e-325").unwrap()); - // These are just about halfway between 0 and the smallest float. - // The first is just below the halfway point, the second just above. - assert_eq!(0.0, s2d(b"2.4703282292062327e-324").unwrap()); - assert_eq!(5e-324, s2d(b"2.4703282292062328e-324").unwrap()); -} - -#[test] -fn test_overflow() { - assert_eq!(f64::INFINITY, s2d(b"2e308").unwrap()); - assert_eq!(f64::INFINITY, s2d(b"1e309").unwrap()); -} - -#[test] -fn test_table_size_denormal() { - assert_eq!(5e-324, s2d(b"4.9406564584124654e-324").unwrap()); -} - -#[test] -fn test_issue157() { - assert_eq!( - 1.2999999999999999E+154, - s2d(b"1.2999999999999999E+154").unwrap(), - ); -} - -#[test] -fn test_issue173() { - // Denormal boundary - assert_eq!( - 2.2250738585072012e-308, - s2d(b"2.2250738585072012e-308").unwrap(), - ); - assert_eq!( - 2.2250738585072013e-308, - s2d(b"2.2250738585072013e-308").unwrap(), - ); - assert_eq!( - 2.2250738585072014e-308, - s2d(b"2.2250738585072014e-308").unwrap(), - ); -} diff --git a/vendor/ryu/tests/s2f_test.rs b/vendor/ryu/tests/s2f_test.rs deleted file mode 100644 index 5bae935..0000000 --- a/vendor/ryu/tests/s2f_test.rs +++ /dev/null @@ -1,110 +0,0 @@ -// Translated from C to Rust. The original C code can be found at -// https://github.com/ulfjack/ryu and carries the following license: -// -// Copyright 2018 Ulf Adams -// -// The contents of this file may be used under the terms of the Apache License, -// Version 2.0. -// -// (See accompanying file LICENSE-Apache or copy at -// http://www.apache.org/licenses/LICENSE-2.0) -// -// Alternatively, the contents of this file may be used under the terms of -// the Boost Software License, Version 1.0. -// (See accompanying file LICENSE-Boost or copy at -// https://www.boost.org/LICENSE_1_0.txt) -// -// Unless required by applicable law or agreed to in writing, this software -// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. - -#![allow(dead_code)] -#![allow( - clippy::cast_lossless, - clippy::cast_possible_truncation, - clippy::cast_possible_wrap, - clippy::cast_possible_wrap, - clippy::cast_sign_loss, - clippy::checked_conversions, - clippy::float_cmp, - clippy::manual_range_contains, - clippy::similar_names, - clippy::too_many_lines, - clippy::unreadable_literal, - clippy::unseparated_literal_suffix, - clippy::wildcard_imports -)] - -#[path = "../src/common.rs"] -mod common; - -#[cfg(not(feature = "small"))] -#[path = "../src/d2s_full_table.rs"] -mod d2s_full_table; - -#[path = "../src/d2s_intrinsics.rs"] -mod d2s_intrinsics; - -#[cfg(feature = "small")] -#[path = "../src/d2s_small_table.rs"] -mod d2s_small_table; - -#[path = "../src/d2s.rs"] -mod d2s; - -#[path = "../src/f2s_intrinsics.rs"] -mod f2s_intrinsics; - -#[path = "../src/f2s.rs"] -mod f2s; - -#[path = "../src/s2f.rs"] -mod s2f; - -#[path = "../src/parse.rs"] -mod parse; - -use crate::parse::Error; -use crate::s2f::s2f; - -impl PartialEq for Error { - fn eq(&self, other: &Self) -> bool { - *self as u8 == *other as u8 - } -} - -#[test] -fn test_basic() { - assert_eq!(0.0, s2f(b"0").unwrap()); - assert_eq!(-0.0, s2f(b"-0").unwrap()); - assert_eq!(1.0, s2f(b"1").unwrap()); - assert_eq!(-1.0, s2f(b"-1").unwrap()); - assert_eq!(123456792.0, s2f(b"123456789").unwrap()); - assert_eq!(299792448.0, s2f(b"299792458").unwrap()); -} - -#[test] -fn test_min_max() { - assert_eq!(1e-45, s2f(b"1e-45").unwrap()); - assert_eq!(f32::MIN_POSITIVE, s2f(b"1.1754944e-38").unwrap()); - assert_eq!(f32::MAX, s2f(b"3.4028235e+38").unwrap()); -} - -#[test] -fn test_mantissa_rounding_overflow() { - assert_eq!(1.0, s2f(b"0.999999999").unwrap()); - assert_eq!(f32::INFINITY, s2f(b"3.4028236e+38").unwrap()); - assert_eq!(1.1754944e-38, s2f(b"1.17549430e-38").unwrap()); // FLT_MIN - assert_eq!(1.1754944e-38, s2f(b"1.17549431e-38").unwrap()); - assert_eq!(1.1754944e-38, s2f(b"1.17549432e-38").unwrap()); - assert_eq!(1.1754944e-38, s2f(b"1.17549433e-38").unwrap()); - assert_eq!(1.1754944e-38, s2f(b"1.17549434e-38").unwrap()); - assert_eq!(1.1754944e-38, s2f(b"1.17549435e-38").unwrap()); -} - -#[test] -fn test_trailing_zeros() { - assert_eq!(26843550.0, s2f(b"26843549.5").unwrap()); - assert_eq!(50000004.0, s2f(b"50000002.5").unwrap()); - assert_eq!(99999992.0, s2f(b"99999989.5").unwrap()); -} -- cgit v1.2.3