{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":155119796,"defaultBranch":"master","name":"hashbrown","ownerLogin":"rust-lang","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-10-28T21:58:58.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/5430905?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1714329097.0","currentOid":""},"activityList":{"items":[{"before":"f1ba3b4547f5a8f0d4b679e4f44298138d89be59","after":"aa1411bdf0f91946d474b257b50dc2992e11f359","ref":"refs/heads/master","pushedAt":"2024-08-23T21:40:00.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #546 - Amanieu:remove-raw, r=Amanieu\n\nRemove the `raw` feature and make `RawTable` private\n\nThis will give more freedom for the internal implementation details of hashbrown to evolve without the need for regular releases with breaking changes.\n\nAll existing users of `RawTable` should migrate to the `HashTable` API which is entirely safe while providing the same flexibility as `RawTable`.\n\nThis also removes the following features which were only exposed under `RawTable`:\n- `RawTable::iter_hash`\n- `RawIter::reflect_insert` and `RawIter::reflect_remove`\n- `RawTable::clone_from_with_hasher`\n- `RawTable::insert_no_grow` and `RawTable::try_insert_no_grow`\n- `RawTable::allocation_info`\n- `RawTable::try_with_capacity(_in)`\n- `HashMap::raw_table(_mut)` and `HashSet::raw_table(_mut)`\n\nIf anyone was previously relying on this functionaly, please raise a comment. It may be possible to re-introduce it as a safe API in `HashTable` and/or `HashMap`.","shortMessageHtmlLink":"Auto merge of #546 - Amanieu:remove-raw, r=Amanieu"}},{"before":"f1ba3b4547f5a8f0d4b679e4f44298138d89be59","after":"aa1411bdf0f91946d474b257b50dc2992e11f359","ref":"refs/heads/auto","pushedAt":"2024-08-23T21:31:51.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #546 - Amanieu:remove-raw, r=Amanieu\n\nRemove the `raw` feature and make `RawTable` private\n\nThis will give more freedom for the internal implementation details of hashbrown to evolve without the need for regular releases with breaking changes.\n\nAll existing users of `RawTable` should migrate to the `HashTable` API which is entirely safe while providing the same flexibility as `RawTable`.\n\nThis also removes the following features which were only exposed under `RawTable`:\n- `RawTable::iter_hash`\n- `RawIter::reflect_insert` and `RawIter::reflect_remove`\n- `RawTable::clone_from_with_hasher`\n- `RawTable::insert_no_grow` and `RawTable::try_insert_no_grow`\n- `RawTable::allocation_info`\n- `RawTable::try_with_capacity(_in)`\n- `HashMap::raw_table(_mut)` and `HashSet::raw_table(_mut)`\n\nIf anyone was previously relying on this functionaly, please raise a comment. It may be possible to re-introduce it as a safe API in `HashTable` and/or `HashMap`.","shortMessageHtmlLink":"Auto merge of #546 - Amanieu:remove-raw, r=Amanieu"}},{"before":"f01e2714966a11443070866580f05bdd20181b6b","after":"f1ba3b4547f5a8f0d4b679e4f44298138d89be59","ref":"refs/heads/master","pushedAt":"2024-08-22T22:26:04.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #535 - Amanieu:rework_entry, r=Amanieu\n\nRework the Entry API\n\nThe main change in this PR is that `OccupiedEntry` no longer holds the\nkey used in the initial `entry` call. As a result, `OccupiedEntryRef` is\nno longer required since `OccupiedEntry` can be used in `EntryRef`\ndirectly.\n\nThe following methods have been removed:\n```rust\n// hash_map\n\nimpl OccupiedEntry {\n fn replace_entry(self, value: V) -> (K, V);\n fn replace_key(self) -> K;\n}\n\nimpl EntryRef {\n fn and_replace_entry_with(self, f: F) -> Self;\n}\n\nimpl VacantEntryRef {\n fn into_key(self) -> K;\n}\n\n// hash_set\n\nimpl Entry {\n fn replace(self) -> T;\n}\n```\n\nThe following methods have been added:\n```rust\nimpl VacantEntry {\n fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n```\n\nThe following methods have their signatures changed:\n```rust\nimpl EntryRef {\n // Previously returned OccupiedEntryRef\n fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n\nimpl VacantEntryRef {\n // Previously returned &Q\n fn key(&self) -> &'b Q;\n\n // Previously returned OccupiedEntryRef\n fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n```","shortMessageHtmlLink":"Auto merge of #535 - Amanieu:rework_entry, r=Amanieu"}},{"before":"f01e2714966a11443070866580f05bdd20181b6b","after":"f1ba3b4547f5a8f0d4b679e4f44298138d89be59","ref":"refs/heads/auto","pushedAt":"2024-08-22T22:17:09.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #535 - Amanieu:rework_entry, r=Amanieu\n\nRework the Entry API\n\nThe main change in this PR is that `OccupiedEntry` no longer holds the\nkey used in the initial `entry` call. As a result, `OccupiedEntryRef` is\nno longer required since `OccupiedEntry` can be used in `EntryRef`\ndirectly.\n\nThe following methods have been removed:\n```rust\n// hash_map\n\nimpl OccupiedEntry {\n fn replace_entry(self, value: V) -> (K, V);\n fn replace_key(self) -> K;\n}\n\nimpl EntryRef {\n fn and_replace_entry_with(self, f: F) -> Self;\n}\n\nimpl VacantEntryRef {\n fn into_key(self) -> K;\n}\n\n// hash_set\n\nimpl Entry {\n fn replace(self) -> T;\n}\n```\n\nThe following methods have been added:\n```rust\nimpl VacantEntry {\n fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n```\n\nThe following methods have their signatures changed:\n```rust\nimpl EntryRef {\n // Previously returned OccupiedEntryRef\n fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n\nimpl VacantEntryRef {\n // Previously returned &Q\n fn key(&self) -> &'b Q;\n\n // Previously returned OccupiedEntryRef\n fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>;\n}\n```","shortMessageHtmlLink":"Auto merge of #535 - Amanieu:rework_entry, r=Amanieu"}},{"before":"f677701e261d497ad72216cefa69fd89b73164cc","after":"f01e2714966a11443070866580f05bdd20181b6b","ref":"refs/heads/master","pushedAt":"2024-08-22T15:43:27.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #534 - Amanieu:deprecate-raw-entry, r=Amanieu\n\nDeprecate the raw entry API in favor of `HashTable`\n\nIt is now moved under the \"raw-entry\" Cargo feature.\n\nFor now the raw-entry feature is kept enabled by default because `HashSet` uses it internally, but this will be disabled by default once this is no longer the case.","shortMessageHtmlLink":"Auto merge of #534 - Amanieu:deprecate-raw-entry, r=Amanieu"}},{"before":"f677701e261d497ad72216cefa69fd89b73164cc","after":"f01e2714966a11443070866580f05bdd20181b6b","ref":"refs/heads/auto","pushedAt":"2024-08-22T15:34:15.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #534 - Amanieu:deprecate-raw-entry, r=Amanieu\n\nDeprecate the raw entry API in favor of `HashTable`\n\nIt is now moved under the \"raw-entry\" Cargo feature.\n\nFor now the raw-entry feature is kept enabled by default because `HashSet` uses it internally, but this will be disabled by default once this is no longer the case.","shortMessageHtmlLink":"Auto merge of #534 - Amanieu:deprecate-raw-entry, r=Amanieu"}},{"before":"ac00a0bbef46f02f555e235f57ce263aefa361e0","after":"f677701e261d497ad72216cefa69fd89b73164cc","ref":"refs/heads/master","pushedAt":"2024-08-05T17:13:21.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #542 - clarfonthey:default-iters, r=Amanieu\n\nImplement Default for iterators\n\nSee rust-lang/rust#128261 for a similar PR for some libstd iterators. In order to do a similar PR for the `HashSet` and `HashMap` types, we need to make these changes to `hashbrown` first to actually implement them.\n\nOne small caveat is that I chose to only implement `Default` for `RawIter` and not `RawIterRange`, since it really exists as an implementation detail anyway, and the best implementation would involve just using the `RawIter` implementation anyway.","shortMessageHtmlLink":"Auto merge of #542 - clarfonthey:default-iters, r=Amanieu"}},{"before":"ac00a0bbef46f02f555e235f57ce263aefa361e0","after":"f677701e261d497ad72216cefa69fd89b73164cc","ref":"refs/heads/auto","pushedAt":"2024-08-05T17:05:06.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #542 - clarfonthey:default-iters, r=Amanieu\n\nImplement Default for iterators\n\nSee rust-lang/rust#128261 for a similar PR for some libstd iterators. In order to do a similar PR for the `HashSet` and `HashMap` types, we need to make these changes to `hashbrown` first to actually implement them.\n\nOne small caveat is that I chose to only implement `Default` for `RawIter` and not `RawIterRange`, since it really exists as an implementation detail anyway, and the best implementation would involve just using the `RawIter` implementation anyway.","shortMessageHtmlLink":"Auto merge of #542 - clarfonthey:default-iters, r=Amanieu"}},{"before":"894b56ffa517efeb14990b2104271c594bc9b9ca","after":"ac00a0bbef46f02f555e235f57ce263aefa361e0","ref":"refs/heads/master","pushedAt":"2024-07-14T19:36:17.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #539 - overlookmotel:fix-comment, r=Amanieu\n\nFix comment\n\nFrom looking at code, I believe this comment was incorrect (or outdated). It seems that `T`s are stored in reverse order.","shortMessageHtmlLink":"Auto merge of #539 - overlookmotel:fix-comment, r=Amanieu"}},{"before":"894b56ffa517efeb14990b2104271c594bc9b9ca","after":"ac00a0bbef46f02f555e235f57ce263aefa361e0","ref":"refs/heads/auto","pushedAt":"2024-07-14T19:27:54.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #539 - overlookmotel:fix-comment, r=Amanieu\n\nFix comment\n\nFrom looking at code, I believe this comment was incorrect (or outdated). It seems that `T`s are stored in reverse order.","shortMessageHtmlLink":"Auto merge of #539 - overlookmotel:fix-comment, r=Amanieu"}},{"before":"8cb647fc2d5710cc5ac42d4553914ba7e4920361","after":"894b56ffa517efeb14990b2104271c594bc9b9ca","ref":"refs/heads/master","pushedAt":"2024-07-14T14:03:44.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #538 - overlookmotel:shorten, r=Amanieu\n\nShorten code\n\nCondense code a little.\n\nI don't know if little PRs like this have more downside in the noise they create for maintainers than the benefit of the changes themselves. If so, please say so! That'd be a completely legitimate response. I'm exploring hashbrown's code, and just submitting small bits where I find them.","shortMessageHtmlLink":"Auto merge of #538 - overlookmotel:shorten, r=Amanieu"}},{"before":"8cb647fc2d5710cc5ac42d4553914ba7e4920361","after":"894b56ffa517efeb14990b2104271c594bc9b9ca","ref":"refs/heads/auto","pushedAt":"2024-07-14T13:55:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #538 - overlookmotel:shorten, r=Amanieu\n\nShorten code\n\nCondense code a little.\n\nI don't know if little PRs like this have more downside in the noise they create for maintainers than the benefit of the changes themselves. If so, please say so! That'd be a completely legitimate response. I'm exploring hashbrown's code, and just submitting small bits where I find them.","shortMessageHtmlLink":"Auto merge of #538 - overlookmotel:shorten, r=Amanieu"}},{"before":"9f24e48e79f5b34cc45ba5eadf79c99fb08a5ce0","after":"8cb647fc2d5710cc5ac42d4553914ba7e4920361","ref":"refs/heads/master","pushedAt":"2024-07-12T13:55:57.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #536 - overlookmotel:fix-docs, r=Amanieu\n\nFix link to std traits in docs\n\nLink to `Hash` in docs for `HashTable` was pointing to `Hash` derive macro, rather than `Hash` trait.","shortMessageHtmlLink":"Auto merge of #536 - overlookmotel:fix-docs, r=Amanieu"}},{"before":"9f24e48e79f5b34cc45ba5eadf79c99fb08a5ce0","after":"8cb647fc2d5710cc5ac42d4553914ba7e4920361","ref":"refs/heads/auto","pushedAt":"2024-07-12T13:47:13.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #536 - overlookmotel:fix-docs, r=Amanieu\n\nFix link to std traits in docs\n\nLink to `Hash` in docs for `HashTable` was pointing to `Hash` derive macro, rather than `Hash` trait.","shortMessageHtmlLink":"Auto merge of #536 - overlookmotel:fix-docs, r=Amanieu"}},{"before":"4c824c548e85d75f95e0dfcee09c62c5203f9a75","after":"9f24e48e79f5b34cc45ba5eadf79c99fb08a5ce0","ref":"refs/heads/master","pushedAt":"2024-07-12T13:46:10.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #537 - overlookmotel:fix-docs2, r=Amanieu\n\nFix links in docs\n\nFix a couple of links in docs.","shortMessageHtmlLink":"Auto merge of #537 - overlookmotel:fix-docs2, r=Amanieu"}},{"before":"4c824c548e85d75f95e0dfcee09c62c5203f9a75","after":"9f24e48e79f5b34cc45ba5eadf79c99fb08a5ce0","ref":"refs/heads/auto","pushedAt":"2024-07-12T13:37:14.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #537 - overlookmotel:fix-docs2, r=Amanieu\n\nFix links in docs\n\nFix a couple of links in docs.","shortMessageHtmlLink":"Auto merge of #537 - overlookmotel:fix-docs2, r=Amanieu"}},{"before":"f0eece41a0e46145692adb0bc9627b01f95ec4a5","after":"4c824c548e85d75f95e0dfcee09c62c5203f9a75","ref":"refs/heads/master","pushedAt":"2024-06-19T17:48:12.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu\n\nReplace \"ahash\" with \"default-hasher\" in Cargo features\n\nThis allows us to change the default hasher in the future without it being a breaking change.","shortMessageHtmlLink":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu"}},{"before":"9595cbfc5d6460781116445868f1f47880995e5e","after":"4c824c548e85d75f95e0dfcee09c62c5203f9a75","ref":"refs/heads/auto","pushedAt":"2024-06-19T17:37:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu\n\nReplace \"ahash\" with \"default-hasher\" in Cargo features\n\nThis allows us to change the default hasher in the future without it being a breaking change.","shortMessageHtmlLink":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu"}},{"before":"f0eece41a0e46145692adb0bc9627b01f95ec4a5","after":"9595cbfc5d6460781116445868f1f47880995e5e","ref":"refs/heads/auto","pushedAt":"2024-06-19T15:01:04.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu\n\nReplace \"ahash\" with \"default-hasher\" in Cargo features\n\nThis allows us to change the default hasher in the future without it being a breaking change.","shortMessageHtmlLink":"Auto merge of #533 - Amanieu:default-hasher, r=Amanieu"}},{"before":"65c553ddd318e7b28cac0f8c922d64108b214ded","after":"f0eece41a0e46145692adb0bc9627b01f95ec4a5","ref":"refs/heads/master","pushedAt":"2024-06-18T13:59:24.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #529 - ToMe25:set_ops_assign, r=Amanieu\n\nImplement XxxAssign operations on HashSets\n\nThis PR primarily implements the XxxAssign operation traits for `HashSet`.\n\nMy primary motivation to do so is for convenience, but depending on the situation they can provide a significant performance improvement as well.\\*\n\nIn my tests, which may not be ideal because I don't have much benchmarking experience, the assigning operations are, with the exception of `Sub`, a minimum of 25% faster.\\*\nNote that when swapping the large and the small set around, some of these are significantly slower than the non-assigning variant.\nTherefore using them is likely only worth it performance wise, if you already know which set is larger, and the right one of the sets just so happens to be the one you don't need to keep.\n\n \\* Results may have changed due to #530 being merged\n\nHere my exact benchmark results, done with the newly added benchmark suit:\n\n\n\nVER | LSIZE | SSIZE | OP | NS/ITER | DIFF (%) | COMMENT\n-- | -- | -- | -- | -- | -- | --\n1 | 1000 | 100 | and | 5,682.88 | | \n1 | 1000 | 100 | or | 41,427.82 | | \n1 | 1000 | 100 | xor | 57,404.27 | | \n1 | 1000 | 100 | subls | 56,262.53 | | \n1 | 1000 | 100 | subsl | 751.42 | | \n1 | 1000 | 2 | and | 100.16 | | \n1 | 1000 | 2 | or | 40,435.09 | | \n1 | 1000 | 2 | xor | 59,058.05 | | \n1 | 1000 | 2 | subls | 58,668.34 | | \n1 | 1000 | 2 | subsl | 18.89 | | \n1 | 1000 | 100 | or_ass | 32,888.49 | -20.61% | unconditional insert\n2 | 1000 | 100 | or_ass | 29,397.04 | -29.04% | !contains insert\n3 | 1000 | 100 | or_ass | 32,399.65 | -21.79% | extend iter().cloned()\n4 | 1000 | 100 | or_ass | 30,693.33 | -25.91% | get_or_insert_owned\n5 | 1000 | 100 | or_ass | 33,722.59 | -18.60% | calc intersection; extend rhs.iter() !intersection contains; Requires S: Clone\n1 | 1000 | 100 | add_ass | 30,114.17 | -26.66% | !contains insert\n1 | 1000 | 100 | xor_ass | 32,309.85 | -43.72% | contains remove else insert\n2 | 1000 | 100 | xor_ass | 40,058.48 | -30.22% | extract_if rhs contains; extend !removed contains\n3 | 1000 | 100 | xor_ass | 31,801.04 | -44.60% | raw_entry().from_key() replace_entry_with / insert\n4 | 1000 | 100 | xor_ass | 31,935.07 | -44.37% | raw_entry().from_key_hashed_nocheck() replace_entry_with / insert_hashed_nocheck\n5 | 1000 | 100 | xor_ass | 31,843.33 | -44.53% | self.map.table.get.is_none self.map.table.insert else self.map.table.remove_entry\n1 | 1000 | 100 | subls_ass | 33,366.13 | -40.70% | contains remove\n1 | 1000 | 100 | subsl_ass | 10,686.02 | 1322.11% | contains remove\n2 | 1000 | 100 | subls_ass | 36,351.69 | -35.39% | retain !contains\n2 | 1000 | 100 | subsl_ass | 3,939.67 | 424.30% | retain !contains\n3 | 1000 | 100 | subls_ass | 32,012.82 | -43.10% | unconditional remove\n3 | 1000 | 100 | subsl_ass | 9,908.76 | 1218.67% | unconditional remove\n4 | 1000 | 100 | subls_ass | 36,232.13 | -35.60% | self.map.retain !contains\n4 | 1000 | 100 | subsl_ass | 3,939.35 | 424.25% | self.map.retain !contains\n5 | 1000 | 100 | subls_ass | 31,879.32 | -43.34% | if rhs smaller self unconditional remove else retain !contains\n5 | 1000 | 100 | subsl_ass | 3,946.98 | 425.27% | if rhs smaller self unconditional remove else retain !contains\n1 | 1000 | 2 | add_ass | 28,324.95 | -29.27% | \n2 | 1000 | 2 | or_ass | 28,322.62 | -29.96% | \n1 | 1000 | 2 | xor_ass | 29,107.31 | -50.71% | \n3 | 1000 | 2 | xor_ass | 29,026.82 | -50.85% | \n1 | 1000 | 2 | subls_ass | 29,310.04 | -50.04% | \n1 | 1000 | 2 | subsl_ass | 4,212.56 | 22200.48% | \n2 | 1000 | 2 | subls_ass | 34,074.85 | -41.92% | \n2 | 1000 | 2 | subsl_ass | 66.43 | 251.67% | \n3 | 1000 | 2 | subls_ass | 29,340.86 | -49.99% | \n3 | 1000 | 2 | subsl_ass | 5,972.25 | 31515.93% | \n5 | 1000 | 2 | subls_ass | 29,460.49 | -49.78% | \n5 | 1000 | 2 | subsl_ass | 65.32 | 245.79% | \n\nIn addition to the Assigning operators this PR changes a few more things:\n * It changes the allocator bound on the non-assigning set operations to `A: Allocator + Default`.\n * I also added a benchmark suit for the set operations.","shortMessageHtmlLink":"Auto merge of #529 - ToMe25:set_ops_assign, r=Amanieu"}},{"before":"65c553ddd318e7b28cac0f8c922d64108b214ded","after":"f0eece41a0e46145692adb0bc9627b01f95ec4a5","ref":"refs/heads/auto","pushedAt":"2024-06-18T13:50:43.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #529 - ToMe25:set_ops_assign, r=Amanieu\n\nImplement XxxAssign operations on HashSets\n\nThis PR primarily implements the XxxAssign operation traits for `HashSet`.\n\nMy primary motivation to do so is for convenience, but depending on the situation they can provide a significant performance improvement as well.\\*\n\nIn my tests, which may not be ideal because I don't have much benchmarking experience, the assigning operations are, with the exception of `Sub`, a minimum of 25% faster.\\*\nNote that when swapping the large and the small set around, some of these are significantly slower than the non-assigning variant.\nTherefore using them is likely only worth it performance wise, if you already know which set is larger, and the right one of the sets just so happens to be the one you don't need to keep.\n\n \\* Results may have changed due to #530 being merged\n\nHere my exact benchmark results, done with the newly added benchmark suit:\n\n\n\nVER | LSIZE | SSIZE | OP | NS/ITER | DIFF (%) | COMMENT\n-- | -- | -- | -- | -- | -- | --\n1 | 1000 | 100 | and | 5,682.88 | | \n1 | 1000 | 100 | or | 41,427.82 | | \n1 | 1000 | 100 | xor | 57,404.27 | | \n1 | 1000 | 100 | subls | 56,262.53 | | \n1 | 1000 | 100 | subsl | 751.42 | | \n1 | 1000 | 2 | and | 100.16 | | \n1 | 1000 | 2 | or | 40,435.09 | | \n1 | 1000 | 2 | xor | 59,058.05 | | \n1 | 1000 | 2 | subls | 58,668.34 | | \n1 | 1000 | 2 | subsl | 18.89 | | \n1 | 1000 | 100 | or_ass | 32,888.49 | -20.61% | unconditional insert\n2 | 1000 | 100 | or_ass | 29,397.04 | -29.04% | !contains insert\n3 | 1000 | 100 | or_ass | 32,399.65 | -21.79% | extend iter().cloned()\n4 | 1000 | 100 | or_ass | 30,693.33 | -25.91% | get_or_insert_owned\n5 | 1000 | 100 | or_ass | 33,722.59 | -18.60% | calc intersection; extend rhs.iter() !intersection contains; Requires S: Clone\n1 | 1000 | 100 | add_ass | 30,114.17 | -26.66% | !contains insert\n1 | 1000 | 100 | xor_ass | 32,309.85 | -43.72% | contains remove else insert\n2 | 1000 | 100 | xor_ass | 40,058.48 | -30.22% | extract_if rhs contains; extend !removed contains\n3 | 1000 | 100 | xor_ass | 31,801.04 | -44.60% | raw_entry().from_key() replace_entry_with / insert\n4 | 1000 | 100 | xor_ass | 31,935.07 | -44.37% | raw_entry().from_key_hashed_nocheck() replace_entry_with / insert_hashed_nocheck\n5 | 1000 | 100 | xor_ass | 31,843.33 | -44.53% | self.map.table.get.is_none self.map.table.insert else self.map.table.remove_entry\n1 | 1000 | 100 | subls_ass | 33,366.13 | -40.70% | contains remove\n1 | 1000 | 100 | subsl_ass | 10,686.02 | 1322.11% | contains remove\n2 | 1000 | 100 | subls_ass | 36,351.69 | -35.39% | retain !contains\n2 | 1000 | 100 | subsl_ass | 3,939.67 | 424.30% | retain !contains\n3 | 1000 | 100 | subls_ass | 32,012.82 | -43.10% | unconditional remove\n3 | 1000 | 100 | subsl_ass | 9,908.76 | 1218.67% | unconditional remove\n4 | 1000 | 100 | subls_ass | 36,232.13 | -35.60% | self.map.retain !contains\n4 | 1000 | 100 | subsl_ass | 3,939.35 | 424.25% | self.map.retain !contains\n5 | 1000 | 100 | subls_ass | 31,879.32 | -43.34% | if rhs smaller self unconditional remove else retain !contains\n5 | 1000 | 100 | subsl_ass | 3,946.98 | 425.27% | if rhs smaller self unconditional remove else retain !contains\n1 | 1000 | 2 | add_ass | 28,324.95 | -29.27% | \n2 | 1000 | 2 | or_ass | 28,322.62 | -29.96% | \n1 | 1000 | 2 | xor_ass | 29,107.31 | -50.71% | \n3 | 1000 | 2 | xor_ass | 29,026.82 | -50.85% | \n1 | 1000 | 2 | subls_ass | 29,310.04 | -50.04% | \n1 | 1000 | 2 | subsl_ass | 4,212.56 | 22200.48% | \n2 | 1000 | 2 | subls_ass | 34,074.85 | -41.92% | \n2 | 1000 | 2 | subsl_ass | 66.43 | 251.67% | \n3 | 1000 | 2 | subls_ass | 29,340.86 | -49.99% | \n3 | 1000 | 2 | subsl_ass | 5,972.25 | 31515.93% | \n5 | 1000 | 2 | subls_ass | 29,460.49 | -49.78% | \n5 | 1000 | 2 | subsl_ass | 65.32 | 245.79% | \n\nIn addition to the Assigning operators this PR changes a few more things:\n * It changes the allocator bound on the non-assigning set operations to `A: Allocator + Default`.\n * I also added a benchmark suit for the set operations.","shortMessageHtmlLink":"Auto merge of #529 - ToMe25:set_ops_assign, r=Amanieu"}},{"before":"a34158ca5528a72668b8ca116c11ccda7df0b9fa","after":"65c553ddd318e7b28cac0f8c922d64108b214ded","ref":"refs/heads/master","pushedAt":"2024-06-17T13:38:15.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #530 - ToMe25:fix_set_diff_size_hint, r=Amanieu\n\nImprove Set Difference size_hint lower bound\n\nThis PR makes the Set `Difference` iterator generate a non-zero lower bound in some situations.\n\nSpecifically, it now returns a non-zero lower bound if the `difference` method is called on a larger set with a smaller set.\nThat is because in those cases the fact that sets can't really contains duplicates\\* guarantees that a minimum of `self.len() - other.len()` items will be returned by the iterator.\n\n\\* Well, they can, but that is already documented to be causing a random mess\n\nThis implementation has the disadvantage that a single `next()` call may reduce the lower bound by more than one.\nEvery size hint generated, even the first largest one, is guaranteed to be correct, but it may be confusing if one `next()` call causes the lower bound to drop by more than one.\n\nThis could be avoided by storing the minimum number of resulting elements in the iterator and subtracting one each time `next()` is called, but I don't think its worth the added complexity.","shortMessageHtmlLink":"Auto merge of #530 - ToMe25:fix_set_diff_size_hint, r=Amanieu"}},{"before":"a34158ca5528a72668b8ca116c11ccda7df0b9fa","after":"65c553ddd318e7b28cac0f8c922d64108b214ded","ref":"refs/heads/auto","pushedAt":"2024-06-17T13:29:27.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #530 - ToMe25:fix_set_diff_size_hint, r=Amanieu\n\nImprove Set Difference size_hint lower bound\n\nThis PR makes the Set `Difference` iterator generate a non-zero lower bound in some situations.\n\nSpecifically, it now returns a non-zero lower bound if the `difference` method is called on a larger set with a smaller set.\nThat is because in those cases the fact that sets can't really contains duplicates\\* guarantees that a minimum of `self.len() - other.len()` items will be returned by the iterator.\n\n\\* Well, they can, but that is already documented to be causing a random mess\n\nThis implementation has the disadvantage that a single `next()` call may reduce the lower bound by more than one.\nEvery size hint generated, even the first largest one, is guaranteed to be correct, but it may be confusing if one `next()` call causes the lower bound to drop by more than one.\n\nThis could be avoided by storing the minimum number of resulting elements in the iterator and subtracting one each time `next()` is called, but I don't think its worth the added complexity.","shortMessageHtmlLink":"Auto merge of #530 - ToMe25:fix_set_diff_size_hint, r=Amanieu"}},{"before":"e25e6bb02e4fe4d58835f525d60f86091f41d50f","after":"a34158ca5528a72668b8ca116c11ccda7df0b9fa","ref":"refs/heads/master","pushedAt":"2024-06-17T13:25:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #532 - stepancheg:equivalent, r=Amanieu\n\nMake equivalent default feature\n\nI think this is how it is meant to be:\n\nhttps://github.com/rust-lang/hashbrown/blob/e25e6bb02e4fe4d58835f525d60f86091f41d50f/src/lib.rs#L140-L142\n\nCC `@cuviper`","shortMessageHtmlLink":"Auto merge of #532 - stepancheg:equivalent, r=Amanieu"}},{"before":"e25e6bb02e4fe4d58835f525d60f86091f41d50f","after":"a34158ca5528a72668b8ca116c11ccda7df0b9fa","ref":"refs/heads/auto","pushedAt":"2024-06-17T13:16:12.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #532 - stepancheg:equivalent, r=Amanieu\n\nMake equivalent default feature\n\nI think this is how it is meant to be:\n\nhttps://github.com/rust-lang/hashbrown/blob/e25e6bb02e4fe4d58835f525d60f86091f41d50f/src/lib.rs#L140-L142\n\nCC `@cuviper`","shortMessageHtmlLink":"Auto merge of #532 - stepancheg:equivalent, r=Amanieu"}},{"before":"2310a958c3280628cefd5bf6eccf08d36cc09df4","after":"e25e6bb02e4fe4d58835f525d60f86091f41d50f","ref":"refs/heads/master","pushedAt":"2024-06-11T13:37:40.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu\n\nOptimize Set is_disjoint\n\nBy using the `Intersection` iterator in `HashSet::is_Disjoint` its performance can be significantly improved in some cases.\nThis is because `intersection()` always uses the shorter set as its iterator.\n\nIt would also be possible to replicate this \"Iterate over the smaller set and check in the larger set\" logic in the is_disjoint method.\nHowever in my benchmarks the approach I chose is faster than that.\n\nThis change only causes a significant improvement when called on the larger of two disjoint sets.\n\nMy benchmark results:\n\nName | Before | After | Diff (%)\n-- | -- | -- | --\ndisjoint_is_disjoint_large_small | 1,147.43 | 535.25 | -53,35 %\ndisjoint_is_disjoint_small_large | 535.66 | 527.59 | -1,51 %\nsubset_is_disjoint | 9.90 | 10.44 | 5,45 %\nsuperset_is_disjoint | 9.80 | 10.43 | 6,43 %","shortMessageHtmlLink":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu"}},{"before":"62dd52194e4148ca91aab1a0687904719e51508c","after":"e25e6bb02e4fe4d58835f525d60f86091f41d50f","ref":"refs/heads/auto","pushedAt":"2024-06-11T13:29:17.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu\n\nOptimize Set is_disjoint\n\nBy using the `Intersection` iterator in `HashSet::is_Disjoint` its performance can be significantly improved in some cases.\nThis is because `intersection()` always uses the shorter set as its iterator.\n\nIt would also be possible to replicate this \"Iterate over the smaller set and check in the larger set\" logic in the is_disjoint method.\nHowever in my benchmarks the approach I chose is faster than that.\n\nThis change only causes a significant improvement when called on the larger of two disjoint sets.\n\nMy benchmark results:\n\nName | Before | After | Diff (%)\n-- | -- | -- | --\ndisjoint_is_disjoint_large_small | 1,147.43 | 535.25 | -53,35 %\ndisjoint_is_disjoint_small_large | 535.66 | 527.59 | -1,51 %\nsubset_is_disjoint | 9.90 | 10.44 | 5,45 %\nsuperset_is_disjoint | 9.80 | 10.43 | 6,43 %","shortMessageHtmlLink":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu"}},{"before":"2310a958c3280628cefd5bf6eccf08d36cc09df4","after":"62dd52194e4148ca91aab1a0687904719e51508c","ref":"refs/heads/auto","pushedAt":"2024-06-10T16:47:04.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu\n\nOptimize Set is_disjoint\n\nBy using the `Intersection` iterator in `HashSet::is_Disjoint` its performance can be significantly improved in some cases.\nThis is because `intersection()` always uses the shorter set as its iterator.\n\nIt would also be possible to replicate this \"Iterate over the smaller set and check in the larger set\" logic in the is_disjoint method.\nHowever in my benchmarks the approach I chose is faster than that.\n\nThis change only causes a significant improvement when called on the larger of two disjoint sets.\n\nMy benchmark results:\n\nName | Before | After | Diff (%)\n-- | -- | -- | --\ndisjoint_is_disjoint_large_small | 1,147.43 | 535.25 | -53,35 %\ndisjoint_is_disjoint_small_large | 535.66 | 527.59 | -1,51 %\nsubset_is_disjoint | 9.90 | 10.44 | 5,45 %\nsuperset_is_disjoint | 9.80 | 10.43 | 6,43 %","shortMessageHtmlLink":"Auto merge of #531 - ToMe25:optimize_is_disjoint, r=Amanieu"}},{"before":"f540cb70fe8921a92bc9a8c7329063ca70989d85","after":"2310a958c3280628cefd5bf6eccf08d36cc09df4","ref":"refs/heads/master","pushedAt":"2024-06-07T11:42:53.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #525 - dzmitry-lahoda-forks:dz/1, r=Amanieu\n\nfeat: borsh serde","shortMessageHtmlLink":"Auto merge of #525 - dzmitry-lahoda-forks:dz/1, r=Amanieu"}},{"before":"f540cb70fe8921a92bc9a8c7329063ca70989d85","after":"2310a958c3280628cefd5bf6eccf08d36cc09df4","ref":"refs/heads/auto","pushedAt":"2024-06-07T11:34:38.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"bors","name":"bors","path":"/bors","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3372342?s=80&v=4"},"commit":{"message":"Auto merge of #525 - dzmitry-lahoda-forks:dz/1, r=Amanieu\n\nfeat: borsh serde","shortMessageHtmlLink":"Auto merge of #525 - dzmitry-lahoda-forks:dz/1, r=Amanieu"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEor8dvgA","startCursor":null,"endCursor":null}},"title":"Activity · rust-lang/hashbrown"}