diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index eee112d..6d2c1e2 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -15,19 +15,17 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install nightly toolchain - run: rustup toolchain install nightly-2024-05-08 + run: rustup toolchain install nightly-2025-06-27 - name: Install miri - run: rustup run nightly-2024-05-08 rustup component add miri + run: rustup run nightly-2025-06-27 rustup component add miri - name: Build and test run: ./ci/jobs/build-and-test.sh fuzz: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install system dependencies - run: sudo apt-get install -y binutils-dev libunwind-dev - - name: Install honggfuzz - run: cargo install --locked --version 0.5.56 honggfuzz + - name: Install cargo fuzz + run: rustup run nightly-2025-06-27 cargo install --locked --version 0.13.1 cargo-fuzz - name: Fuzz run: ./ci/jobs/fuzz.sh clippy: diff --git a/CHANGELOG.md b/CHANGELOG.md index d0bb908..3af8093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- `hashbrown` was updated to 0.14.5 +- replaced `honggfuzz` by `libfuzzer-sys` +- Set MSRV to 1.78.0 + ## 0.2.4 - 2025-01-03 - Implement `From` for `ByLength` and `ByMemoryUsage` (#9) diff --git a/Cargo.lock b/Cargo.lock index 41247ec..c74161b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,23 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "getrandom", @@ -35,6 +24,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anes" version = "0.1.6" @@ -42,42 +37,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] -name = "arbitrary" -version = "1.4.1" +name = "anstyle" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -dependencies = [ - "derive_arbitrary", -] +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] -name = "atty" -version = "0.2.14" +name = "arbitrary" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ - "hermit-abi", - "libc", - "winapi", + "derive_arbitrary", ] [[package]] name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "bitflags" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "cast" @@ -85,11 +69,23 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cc" +version = "1.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "ciborium" @@ -120,46 +116,47 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.25" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ - "bitflags", - "clap_lex", - "indexmap", - "textwrap", + "clap_builder", ] [[package]] -name = "clap_lex" -version = "0.2.4" +name = "clap_builder" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ - "os_str_bytes", + "anstyle", + "clap_lex", ] +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + [[package]] name = "criterion" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "e1c047a62b0cc3e145fa84415a3191f628e980b194c2755aa12300a4e6cbd928" dependencies = [ "anes", - "atty", "cast", "ciborium", "clap", "criterion-plot", "itertools", - "lazy_static", "num-traits", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -167,9 +164,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", "itertools", @@ -202,15 +199,15 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", @@ -219,37 +216,55 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "fuzz" version = "0.1.0" dependencies = [ - "ahash 0.8.11", - "arbitrary", - "honggfuzz", + "ahash", + "libfuzzer-sys", "lru", "schnellru", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", + "r-efi", "wasi", ] [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -257,116 +272,102 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "honggfuzz" -version = "0.5.56" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "arbitrary", - "lazy_static", - "memmap2", - "rustc_version", + "allocator-api2", + "equivalent", + "foldhash", ] [[package]] name = "indexmap" -version = "1.9.3" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ - "autocfg", - "hashbrown 0.12.3", + "equivalent", + "hashbrown 0.15.5", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "libc" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] -name = "libc" -version = "0.2.169" +name = "libfuzzer-sys" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] [[package]] name = "log" -version = "0.4.22" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru" -version = "0.8.1" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +checksum = "bfe949189f46fabb938b3a9a0be30fdd93fd8a09260da863399a8cf3db756ec8" dependencies = [ - "hashbrown 0.12.3", + "hashbrown 0.15.5", ] [[package]] name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.9.5" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "num-traits" @@ -379,21 +380,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "oorandom" -version = "11.1.4" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" - -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "plotters" @@ -425,27 +420,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -453,9 +454,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -463,9 +464,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -475,9 +476,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -486,24 +487,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "rustc_version" -version = "0.4.1" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -518,35 +516,39 @@ dependencies = [ name = "schnellru" version = "0.2.4" dependencies = [ - "ahash 0.8.11", + "ahash", "cfg-if", "criterion", - "hashbrown 0.13.2", + "hashbrown 0.14.5", "indexmap", "lru", "oorandom", ] [[package]] -name = "semver" -version = "1.0.24" +name = "serde" +version = "1.0.220" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "ceecad4c782e936ac90ecfd6b56532322e3262b14320abf30ce89a92ffdbfe22" +dependencies = [ + "serde_core", + "serde_derive", +] [[package]] -name = "serde" -version = "1.0.217" +name = "serde_core" +version = "1.0.220" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "ddba47394f3b862d6ff6efdbd26ca4673e3566a307880a0ffb98f274bbe0ec32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.220" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "60e1f3b1761e96def5ec6d04a6e7421c0404fa3cf5c0155f1e2848fae3d8cc08" dependencies = [ "proc-macro2", "quote", @@ -555,9 +557,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -565,23 +567,23 @@ dependencies = [ "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" -version = "2.0.94" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "textwrap" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" - [[package]] name = "tinytemplate" version = "1.2.1" @@ -594,9 +596,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "version_check" @@ -616,26 +618,40 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.14.5+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.0+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -647,9 +663,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -657,9 +673,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -670,138 +686,67 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-link" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "wit-bindgen" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index f42cb46..f78959f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT/Apache-2.0" readme = "README.md" description = "A fast and flexible LRU map" edition = "2021" -rust-version = "1.71.1" +rust-version = "1.78.0" [features] default = ["runtime-rng"] @@ -23,15 +23,15 @@ targets = ["x86_64-unknown-linux-gnu"] # We depend on some of `hashbrown`'s internal details for some of our functionality. # While it is unlikely those internal details suddenly change in a minor version update # it's safer to just explicitly pin the exact minor version we need. -hashbrown = { version = "= 0.13.2", features = ["raw", "inline-more"], default-features = false } +hashbrown = { version = "= 0.14.5", features = ["raw", "inline-more"], default-features = false } -ahash = { version = "0.8.2", default-features = false } -cfg-if = "1.0.0" +ahash = { version = "0.8.12", default-features = false } +cfg-if = "1.0.3" [dev-dependencies] -criterion = "0.4.0" -lru = "0.8.1" -indexmap = "1.9.2" +criterion = "0.7.0" +lru = "0.16.1" +indexmap = "2.11.1" oorandom = "11.1.3" [[bench]] diff --git a/benches/benches.rs b/benches/benches.rs index f713d53..8ba3368 100644 --- a/benches/benches.rs +++ b/benches/benches.rs @@ -1,5 +1,6 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{criterion_group, criterion_main, Criterion}; use schnellru::*; +use std::hint::black_box; fn lru_benchmarks(c: &mut Criterion) { c.bench_function("insert million elements with half million cap (schnellru)", |b| { diff --git a/ci/jobs/build-and-test.sh b/ci/jobs/build-and-test.sh index 2118a1b..930e6bf 100755 --- a/ci/jobs/build-and-test.sh +++ b/ci/jobs/build-and-test.sh @@ -20,12 +20,12 @@ echo ">> cargo test (release)" cargo test --all --release echo ">> cargo test (randomize-layout)" -RUSTFLAGS="-Z randomize-layout" rustup run nightly-2024-05-08 cargo test +RUSTFLAGS="-Z randomize-layout" rustup run nightly-2025-06-27 cargo test echo ">> cargo test (randomize-layout, release)" -RUSTFLAGS="-Z randomize-layout" rustup run nightly-2024-05-08 cargo test --release +RUSTFLAGS="-Z randomize-layout" rustup run nightly-2025-06-27 cargo test --release echo ">> cargo miri" -rustup run nightly-2024-05-08 cargo miri test +rustup run nightly-2025-06-27 cargo miri test echo "All OK!" diff --git a/ci/jobs/fuzz.sh b/ci/jobs/fuzz.sh index ed1edd8..44aab2e 100755 --- a/ci/jobs/fuzz.sh +++ b/ci/jobs/fuzz.sh @@ -4,16 +4,17 @@ set -euo pipefail cd -- "$(dirname -- "${BASH_SOURCE[0]}")" cd ../.. -export HFUZZ_RUN_ARGS="--timeout 5 --verbose --iterations 10000000 --exit_upon_crash" +# https://llvm.org/docs/LibFuzzer.html#options +LIBFUZZ_RUN_ARGS="--verbose --jobs=$(nproc) -- -runs=10000000 -timeout=5 -print_final_stats=1 -print_pcs=1" cd fuzz -echo ">> hfuzz fuzz-behavior-matches-lru" -cargo hfuzz run fuzz-behavior-matches-lru +echo ">> fuzz-behavior-matches-lru" +cargo +nightly-2025-06-27 fuzz run fuzz-behavior-matches-lru $LIBFUZZ_RUN_ARGS echo ">> fuzz-internal-invariants" -cargo hfuzz run fuzz-internal-invariants +cargo +nightly-2025-06-27 fuzz run fuzz-internal-invariants $LIBFUZZ_RUN_ARGS echo ">> fuzz-by-memory-usage-works" -cargo hfuzz run fuzz-by-memory-usage-works +cargo +nightly-2025-06-27 fuzz run fuzz-by-memory-usage-works $LIBFUZZ_RUN_ARGS echo "All OK!" diff --git a/fuzz/.gitignore b/fuzz/.gitignore index 3137cfb..4889b15 100644 --- a/fuzz/.gitignore +++ b/fuzz/.gitignore @@ -1,2 +1,4 @@ -hfuzz_target -hfuzz_workspace \ No newline at end of file +target +corpus +artifacts +coverage \ No newline at end of file diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 4744fc3..118770e 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -4,24 +4,32 @@ version = "0.1.0" edition = "2021" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[package.metadata] +cargo-fuzz = true [[bin]] name = "fuzz-behavior-matches-lru" path = "src/fuzz-behavior-matches-lru.rs" +test = false +doc = false +bench = false [[bin]] name = "fuzz-internal-invariants" path = "src/fuzz-internal-invariants.rs" +test = false +doc = false +bench = false [[bin]] name = "fuzz-by-memory-usage-works" path = "src/fuzz-by-memory-usage-works.rs" +test = false +doc = false +bench = false [dependencies] -arbitrary = { version = "1", features = ["derive"] } -honggfuzz = "0.5.56" -lru = "0.8.1" - +libfuzzer-sys = { version = "0.4.10", features = ["arbitrary-derive"] } +lru = "0.16.1" schnellru = { path = ".." } -ahash = "0.8" +ahash = "0.8.12" diff --git a/fuzz/README.md b/fuzz/README.md index db33b7f..eda4586 100644 --- a/fuzz/README.md +++ b/fuzz/README.md @@ -3,5 +3,5 @@ Fuzz tests for `schnellru` crate. Installation: ``` -cargo install -f honggfuzz +cargo install -f cargo-fuzz ``` diff --git a/fuzz/src/fuzz-behavior-matches-lru.rs b/fuzz/src/fuzz-behavior-matches-lru.rs index 68cfec3..6b26a79 100644 --- a/fuzz/src/fuzz-behavior-matches-lru.rs +++ b/fuzz/src/fuzz-behavior-matches-lru.rs @@ -1,10 +1,13 @@ -use arbitrary::Arbitrary; -use honggfuzz::fuzz; +#![no_main] +use libfuzzer_sys::{ + arbitrary::{self, Arbitrary}, + fuzz_target, +}; use std::num::NonZeroUsize; type Key = u16; -#[derive(Arbitrary)] +#[derive(Debug, Arbitrary)] pub enum Action { Insert { key: Key, value: u8 }, GetOrInsert { key: Key, value: u8 }, @@ -15,51 +18,47 @@ pub enum Action { Clear, } -#[derive(Arbitrary)] +#[derive(Debug, Arbitrary)] pub struct Testcase { hasher_seed: usize, length: u16, actions: Vec, } -fn main() { - loop { - fuzz!(|testcase: Testcase| { - let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); - let length = std::cmp::max(1, testcase.length) as usize; - let mut lru = schnellru::LruMap::with_hasher(schnellru::ByLength::new(length as u32), hasher.clone()); - let mut lru_sanity = lru::LruCache::with_hasher(NonZeroUsize::new(length).unwrap(), hasher); +fuzz_target!(|testcase: Testcase| { + let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); + let length = std::cmp::max(1, testcase.length) as usize; + let mut lru = schnellru::LruMap::with_hasher(schnellru::ByLength::new(length as u32), hasher.clone()); + let mut lru_sanity = lru::LruCache::with_hasher(NonZeroUsize::new(length).unwrap(), hasher); - for action in testcase.actions { - match action { - Action::Insert { key, value } => { - lru.insert(key, value); - lru_sanity.push(key, value); - assert_eq!(lru.len(), lru_sanity.len()); - } - Action::GetOrInsert { key, value } => { - let value_lru = lru.get_or_insert(key, || value).unwrap(); - let value_lru_sanity = lru_sanity.get_or_insert(key, || value); - assert_eq!(value_lru, value_lru_sanity); - } - Action::Get { key } => { - assert_eq!(lru.get(&key).copied(), lru_sanity.get(&key).copied()); - } - Action::Remove { key } => { - assert_eq!(lru.remove(&key), lru_sanity.pop(&key)); - } - Action::Peek { key } => { - assert_eq!(lru.peek(&key), lru_sanity.peek(&key)); - } - Action::PopOldest => { - assert_eq!(lru.pop_oldest(), lru_sanity.pop_lru()); - } - Action::Clear => { - lru.clear(); - lru_sanity.clear(); - } - } + for action in testcase.actions { + match action { + Action::Insert { key, value } => { + lru.insert(key, value); + lru_sanity.push(key, value); + assert_eq!(lru.len(), lru_sanity.len()); } - }); + Action::GetOrInsert { key, value } => { + let value_lru = lru.get_or_insert(key, || value).unwrap(); + let value_lru_sanity = lru_sanity.get_or_insert(key, || value); + assert_eq!(value_lru, value_lru_sanity); + } + Action::Get { key } => { + assert_eq!(lru.get(&key).copied(), lru_sanity.get(&key).copied()); + } + Action::Remove { key } => { + assert_eq!(lru.remove(&key), lru_sanity.pop(&key)); + } + Action::Peek { key } => { + assert_eq!(lru.peek(&key), lru_sanity.peek(&key)); + } + Action::PopOldest => { + assert_eq!(lru.pop_oldest(), lru_sanity.pop_lru()); + } + Action::Clear => { + lru.clear(); + lru_sanity.clear(); + } + } } -} +}); diff --git a/fuzz/src/fuzz-by-memory-usage-works.rs b/fuzz/src/fuzz-by-memory-usage-works.rs index 698b449..fbbf003 100644 --- a/fuzz/src/fuzz-by-memory-usage-works.rs +++ b/fuzz/src/fuzz-by-memory-usage-works.rs @@ -1,9 +1,12 @@ -use arbitrary::Arbitrary; -use honggfuzz::fuzz; +#![no_main] +use libfuzzer_sys::{ + arbitrary::{self, Arbitrary}, + fuzz_target, +}; type Key = u16; -#[derive(Arbitrary, Debug)] +#[derive(Debug, Arbitrary)] pub enum Action { Insert { key: Key, value: u8 }, Remove { key: Key }, @@ -12,7 +15,7 @@ pub enum Action { Clear, } -#[derive(Arbitrary, Debug)] +#[derive(Debug, Arbitrary)] pub struct Testcase { hasher_seed: usize, memory_usage: u16, @@ -78,41 +81,37 @@ impl schnellru::Limiter for ByMemoryUsage { } } -fn main() { - loop { - fuzz!(|testcase: Testcase| { - let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); - let limiter = ByMemoryUsage::new(testcase.memory_usage as usize); - let mut lru = schnellru::LruMap::with_hasher(limiter, hasher); - let mut last_pointer = std::ptr::null(); - - for action in testcase.actions { - match action { - Action::Insert { key, value } => { - lru.insert(key, value); - } - Action::Remove { key } => { - lru.remove(&key); - } - Action::PopOldest => { - lru.pop_oldest(); - } - Action::PopNewest => { - lru.pop_newest(); - } - Action::Clear => { - lru.clear(); - } - } - - assert!(lru.memory_usage() <= testcase.memory_usage as usize); - - let pointer = lru.allocation_pointer(); - if lru.limiter().hit_memory_limit { - assert_eq!(pointer, last_pointer); - } - last_pointer = pointer; +fuzz_target!(|testcase: Testcase| { + let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); + let limiter = ByMemoryUsage::new(testcase.memory_usage as usize); + let mut lru = schnellru::LruMap::with_hasher(limiter, hasher); + let mut last_pointer = std::ptr::null(); + + for action in testcase.actions { + match action { + Action::Insert { key, value } => { + lru.insert(key, value); + } + Action::Remove { key } => { + lru.remove(&key); + } + Action::PopOldest => { + lru.pop_oldest(); + } + Action::PopNewest => { + lru.pop_newest(); + } + Action::Clear => { + lru.clear(); } - }); + } + + assert!(lru.memory_usage() <= testcase.memory_usage as usize); + + let pointer = lru.allocation_pointer(); + if lru.limiter().hit_memory_limit { + assert_eq!(pointer, last_pointer); + } + last_pointer = pointer; } -} +}); diff --git a/fuzz/src/fuzz-internal-invariants.rs b/fuzz/src/fuzz-internal-invariants.rs index fcd95de..b42dabf 100644 --- a/fuzz/src/fuzz-internal-invariants.rs +++ b/fuzz/src/fuzz-internal-invariants.rs @@ -1,9 +1,12 @@ -use arbitrary::Arbitrary; -use honggfuzz::fuzz; +#![no_main] +use libfuzzer_sys::{ + arbitrary::{self, Arbitrary}, + fuzz_target, +}; type Key = u16; -#[derive(Arbitrary, Debug)] +#[derive(Debug, Arbitrary)] pub enum Action { Insert { key: Key, value: u8 }, GetOrInsert { key: Key, value: u8 }, @@ -15,7 +18,7 @@ pub enum Action { ToggleOverflow, } -#[derive(Arbitrary)] +#[derive(Debug, Arbitrary)] pub struct Testcase { hasher_seed: usize, length: u16, @@ -83,45 +86,41 @@ impl schnellru::Limiter for LimitedLength { } } -fn main() { - loop { - fuzz!(|testcase: Testcase| { - let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); - let mut lru = schnellru::LruMap::with_hasher(LimitedLength::new(testcase.length as usize), hasher); - for action in &testcase.actions { - match action { - Action::Insert { key, value } => { - lru.insert(key, value); - } - Action::GetOrInsert { key, value } => { - let value = lru.get_or_insert(key, || value); - if testcase.length == 0 { - assert!(value.is_none()); - } - } - Action::Get { key } => { - lru.get(&key); - } - Action::Remove { key } => { - lru.remove(&key); - } - Action::PopOldest => { - lru.pop_oldest(); - } - Action::PopNewest => { - lru.pop_newest(); - } - Action::Clear => { - lru.clear(); - } - Action::ToggleOverflow => { - let value = !lru.limiter_mut().overflow; - lru.limiter_mut().overflow = value; - } +fuzz_target!(|testcase: Testcase| { + let hasher = ahash::RandomState::with_seed(testcase.hasher_seed); + let mut lru = schnellru::LruMap::with_hasher(LimitedLength::new(testcase.length as usize), hasher); + for action in &testcase.actions { + match action { + Action::Insert { key, value } => { + lru.insert(key, value); + } + Action::GetOrInsert { key, value } => { + let value = lru.get_or_insert(key, || value); + if testcase.length == 0 { + assert!(value.is_none()); } - - lru.assert_check_internal_state(); } - }); + Action::Get { key } => { + lru.get(&key); + } + Action::Remove { key } => { + lru.remove(&key); + } + Action::PopOldest => { + lru.pop_oldest(); + } + Action::PopNewest => { + lru.pop_newest(); + } + Action::Clear => { + lru.clear(); + } + Action::ToggleOverflow => { + let value = !lru.limiter_mut().overflow; + lru.limiter_mut().overflow = value; + } + } + + lru.assert_check_internal_state(); } -} +}); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index e6d1df7..1de01fa 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.71.1" +channel = "1.81.0" diff --git a/src/lib.rs b/src/lib.rs index 3064acf..8450988 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -600,9 +600,7 @@ where where T: Hash + ?Sized, { - let mut hasher = self.hasher.build_hasher(); - key.hash(&mut hasher); - hasher.finish() + self.hasher.hash_one(key) } /// Returns a reference to the value for a given key and promotes that element to be the most @@ -636,7 +634,7 @@ where #[inline] pub fn get_or_insert<'a>( &mut self, - key: (impl Into> + Hash + PartialEq + ?Sized), + key: impl Into> + Hash + PartialEq, get: impl FnOnce() -> V, ) -> Option<&mut V> where @@ -652,7 +650,7 @@ where #[inline] pub fn get_or_insert_fallible<'a, E>( &mut self, - key: (impl Into> + Hash + PartialEq + ?Sized), + key: impl Into> + Hash + PartialEq, get: impl FnOnce() -> Result, ) -> Result, E> where @@ -823,7 +821,7 @@ where // SAFETY: Map is not empty so at least one bucket must exist. let mut oldest_entry = unsafe { let oldest_bucket = self.map.bucket(self.oldest.into_usize()); - self.map.remove(oldest_bucket) + self.map.remove(oldest_bucket).0 }; debug_assert_eq!(oldest_entry.older, L::LinkType::MAX); @@ -870,7 +868,7 @@ where // SAFETY: Map is not empty so at least one bucket must exist. let mut newest_entry = unsafe { let newest_bucket = self.map.bucket(self.newest.into_usize()); - self.map.remove(newest_bucket) + self.map.remove(newest_bucket).0 }; debug_assert_eq!(newest_entry.newer, L::LinkType::MAX); @@ -989,7 +987,7 @@ where unsafe fn remove_bucket(&mut self, bucket: Bucket>) -> Entry { self.assert_not_empty(); let index = L::LinkType::from_usize(self.map.bucket_index(&bucket)); - let mut entry = self.map.remove(bucket); + let mut entry = self.map.remove(bucket).0; if self.newest == index { self.newest = entry.older; @@ -1244,11 +1242,7 @@ where // but we can force it to do it through 'reserve'. It's a hack, but it works. let extra_capacity = full_capacity_for_buckets(bucket_count) / 2 - guard.map.len(); let hasher = &self.hasher; - guard.map.reserve(extra_capacity, |entry| { - let mut hasher = hasher.build_hasher(); - entry.key.hash(&mut hasher); - hasher.finish() - }); + guard.map.reserve(extra_capacity, |entry| hasher.hash_one(&entry.key)); core::mem::forget(guard); } @@ -1386,7 +1380,7 @@ where let mut iter = old_map.iter(); while let Some(old_bucket) = iter.next() { let old_index = old_map.bucket_index(&old_bucket); - let entry = old_map.remove(old_bucket); + let entry = old_map.remove(old_bucket).0; let hash = self.hash_key(&entry.key); let new_bucket = self.map.insert_no_grow(hash, entry); @@ -1422,7 +1416,7 @@ where } /// An iterator over all of the elements in the most recently used order. - pub fn iter(&self) -> Iter { + pub fn iter(&self) -> Iter<'_, K, V, L> { Iter { map: &self.map, newest: self.newest, @@ -1432,7 +1426,7 @@ where } /// A mutable iterator over all of the elements in the most recently used order. - pub fn iter_mut(&mut self) -> IterMut { + pub fn iter_mut(&mut self) -> IterMut<'_, K, V, L> { let newest = self.newest; let oldest = self.oldest; let remaining = self.len(); @@ -1447,7 +1441,7 @@ where /// Drains the map of all of its elements in the most recently used order. /// /// When the iterator is dropped the map will be automatically cleared. - pub fn drain(&mut self) -> Drain { + pub fn drain(&mut self) -> Drain<'_, K, V, L, S> { Drain { map: self } } @@ -2438,7 +2432,7 @@ mod tests { for n in 0..limit { lru.insert(n, n); assert_eq!(lru.len(), n + 1); - assert_eq!(lru.peek_oldest().unwrap(), (&0, &0), "failed at {}", n); + assert_eq!(lru.peek_oldest().unwrap(), (&0, &0), "failed at {n}"); assert_eq!(lru.peek_newest().unwrap(), (&n, &n)); } @@ -2460,8 +2454,8 @@ mod tests { for n in 0..limit { lru.insert(n, ()); - assert_eq!(lru.len(), n as usize + 1, "failed at {}", n); - assert_eq!(lru.peek_oldest().unwrap(), (&0, &()), "failed at {}", n); + assert_eq!(lru.len(), n as usize + 1, "failed at {n}"); + assert_eq!(lru.peek_oldest().unwrap(), (&0, &()), "failed at {n}"); assert_eq!(lru.peek_newest().unwrap(), (&n, &())); }