Commit graph

239 commits

Author SHA1 Message Date
bors
e2223c94bf Auto merge of #68827 - ssomers:btree_navigation_revisited, r=Mark-Simulacrum
BTreeMap navigation done safer & faster

It turns out that there was a faster way to do the tree navigation code bundled in #67073, by moving from edge to KV and from KV to next edge separately. It extracts most of the code as safe functions, and contains the duplication of handles within the short wrapper functions.

This somehow hits a sweet spot in the compiler because it reports boosts all over the board:
```
>cargo benchcmp pre3.txt posz4.txt --threshold 5
 name                                           pre3.txt ns/iter  posz4.txt ns/iter  diff ns/iter   diff %  speedup
 btree::map::first_and_last_0                   40                37                           -3   -7.50%   x 1.08
 btree::map::first_and_last_100                 58                44                          -14  -24.14%   x 1.32
 btree::map::iter_1000                          8,920             3,419                    -5,501  -61.67%   x 2.61
 btree::map::iter_100000                        1,069,290         411,615                -657,675  -61.51%   x 2.60
 btree::map::iter_20                            169               58                         -111  -65.68%   x 2.91
 btree::map::iter_mut_1000                      8,701             3,303                    -5,398  -62.04%   x 2.63
 btree::map::iter_mut_100000                    1,034,560         405,975                -628,585  -60.76%   x 2.55
 btree::map::iter_mut_20                        165               58                         -107  -64.85%   x 2.84
 btree::set::clone_100                          1,831             1,562                      -269  -14.69%   x 1.17
 btree::set::clone_100_and_clear                1,831             1,565                      -266  -14.53%   x 1.17
 btree::set::clone_100_and_into_iter            1,917             1,541                      -376  -19.61%   x 1.24
 btree::set::clone_100_and_pop_all              2,609             2,441                      -168   -6.44%   x 1.07
 btree::set::clone_100_and_remove_all           4,598             3,927                      -671  -14.59%   x 1.17
 btree::set::clone_100_and_remove_half          2,765             2,551                      -214   -7.74%   x 1.08
 btree::set::clone_10k                          191,610           164,616                 -26,994  -14.09%   x 1.16
 btree::set::clone_10k_and_clear                192,003           164,616                 -27,387  -14.26%   x 1.17
 btree::set::clone_10k_and_into_iter            200,037           163,010                 -37,027  -18.51%   x 1.23
 btree::set::clone_10k_and_pop_all              267,023           250,913                 -16,110   -6.03%   x 1.06
 btree::set::clone_10k_and_remove_all           536,230           464,100                 -72,130  -13.45%   x 1.16
 btree::set::clone_10k_and_remove_half          453,350           430,545                 -22,805   -5.03%   x 1.05
 btree::set::difference_random_100_vs_100       1,787             801                        -986  -55.18%   x 2.23
 btree::set::difference_random_100_vs_10k       2,978             2,696                      -282   -9.47%   x 1.10
 btree::set::difference_random_10k_vs_100       111,075           54,734                  -56,341  -50.72%   x 2.03
 btree::set::difference_random_10k_vs_10k       246,380           175,980                 -70,400  -28.57%   x 1.40
 btree::set::difference_staggered_100_vs_100    1,789             951                        -838  -46.84%   x 1.88
 btree::set::difference_staggered_100_vs_10k    2,798             2,606                      -192   -6.86%   x 1.07
 btree::set::difference_staggered_10k_vs_10k    176,452           97,401                  -79,051  -44.80%   x 1.81
 btree::set::intersection_100_neg_vs_10k_pos    34                32                           -2   -5.88%   x 1.06
 btree::set::intersection_100_pos_vs_100_neg    30                27                           -3  -10.00%   x 1.11
 btree::set::intersection_random_100_vs_100     1,537             613                        -924  -60.12%   x 2.51
 btree::set::intersection_random_100_vs_10k     2,793             2,649                      -144   -5.16%   x 1.05
 btree::set::intersection_random_10k_vs_10k     222,127           147,166                 -74,961  -33.75%   x 1.51
 btree::set::intersection_staggered_100_vs_100  1,447             622                        -825  -57.01%   x 2.33
 btree::set::intersection_staggered_100_vs_10k  2,606             2,382                      -224   -8.60%   x 1.09
 btree::set::intersection_staggered_10k_vs_10k  143,620           58,790                  -84,830  -59.07%   x 2.44
 btree::set::is_subset_100_vs_100               1,349             488                        -861  -63.83%   x 2.76
 btree::set::is_subset_100_vs_10k               1,720             1,428                      -292  -16.98%   x 1.20
 btree::set::is_subset_10k_vs_10k               135,984           48,527                  -87,457  -64.31%   x 2.80
```
The `first_and_last` ones are noise (they don't do iteration), the others seem genuine.
As always, approved by Miri.

Also, a separate commit with some more benchmarks of mutable behaviour (which also benefit).

r? @cuviper
2020-02-28 09:32:34 +00:00
Stein Somers
9f7b58f3c9 Make implementation of navigation simpler, safer and faster 2020-02-28 01:06:23 +01:00
Stein Somers
4f6661a18d Fix and test implementation of BTreeMap's first_entry, last_entry, pop_first, pop_last 2020-02-28 00:13:32 +01:00
bors
892cb143e5 Auto merge of #67290 - jonas-schievink:leak-audit, r=KodrAus
Audit liballoc for leaks in `Drop` impls when user destructor panics

Inspired by https://github.com/rust-lang/rust/pull/67243 and https://github.com/rust-lang/rust/pull/67235, this audits and hopefully fixes the remaining `Drop` impls in liballoc for resource leaks in the presence of panics in destructors called by the affected `Drop` impl.

This does not touch `Hash{Map,Set}` since they live in hashbrown. They have similar issues though.

r? @KodrAus
2020-02-26 12:48:53 +00:00
Dylan DPC
f7ce5ff19c
Rollup merge of #68705 - BijanT:ll_remove, r=Mark-Simulacrum
Add LinkedList::remove()

LinkedList::remove() removes the element at the specified index and returns it.

I added this because I think having a remove function would be useful to have, and similar functions are in other containers, like Vec and HashMap.

I'm not sure if adding a feature like this requires an RFC or not, so I'm sorry if this PR is premature.
2020-02-20 10:49:08 +01:00
Bijan Tabatabai
c797ce7877 Add LinkedList::remove()
LinkedList::remove() removes the element at the specified index and returns it.

Signed-off-by: Bijan Tabatabai <bijan311@yahoo.com>
2020-02-19 10:29:12 -06:00
Stein Somers
914b855f40 Fix comments outdated during #66648 2020-02-16 22:10:14 +01:00
Dylan DPC
cb87c958ef
Rollup merge of #68834 - ssomers:btree_first_last_fix68829, r=KodrAus
Fix and test implementation of BTreeMap's first/last_entry, pop_first/last

Properly implement and test `first_entry` & `last_entry` to fix problem report #68829
2020-02-09 00:53:52 +01:00
Stein Somers
ae03e16d08 Lift range_search up one level of abstraction 2020-02-07 02:41:28 +01:00
Stein Somers
fa9bfebfc9 Fix and test implementation of BTreeMap's first_entry, last_entry, pop_first, pop_last 2020-02-04 22:35:43 +01:00
Stein Somers
3cf724d0c1 Bundle and document 6 BTreeMap navigation algorithms 2020-01-31 17:37:17 +01:00
Dylan DPC
f837c730ca
Rollup merge of #68468 - ssomers:btreemap_prefer_middle, r=Mark-Simulacrum
BTreeMap: tag and explain unsafe internal functions or assert preconditions

#68418 concluded that it's not desirable to tag all internal functions with preconditions as being unsafe. This PR does it to some functions, documents why, and elsewhere enforces the preconditions with asserts.
2020-01-30 01:46:42 +01:00
Dylan DPC
12c9562486
Rollup merge of #66648 - crgl:btree-clone-from, r=Amanieu
Implement clone_from for BTreeMap and BTreeSet

See #28481. This results in up to 90% speedups on simple data types when `self` and `other` are the same size, and is generally comparable or faster. Some concerns:

1. This implementation requires an `Ord` bound on the `Clone` implementation for `BTreeMap` and `BTreeSet`. Since these structs can only be created externally for keys with `Ord` implemented, this should be fine? If not, there's certainly a less safe way to do this.
2. Changing `next_unchecked` on `RangeMut` to return mutable key references allows for replacing the entire overlapping portion of both maps without changing the external interface in any way. However, if `clone_from` fails it can leave the `BTreeMap` in an invalid state, which might be unacceptable.

~This probably needs an FCP since it changes a trait bound, but (as far as I know?) that change cannot break any external code.~
2020-01-30 01:46:38 +01:00
Stein Somers
ba87a50332 BTreeMap: tag and explain unsafe internal functions or assert preconditions
Co-Authored-By: Mark Rousskov <mark.simulacrum@gmail.com>
2020-01-29 11:52:21 +01:00
Yuki Okushi
af0c280be6
Rollup merge of #68378 - billyrieger:btreemap-remove-entry, r=KodrAus
Add BTreeMap::remove_entry

Implements https://github.com/rust-lang/rust/issues/66714.
2020-01-29 09:34:45 +09:00
Charles Gleason
6c3e477d13 Reformat truncation section of clone_from 2020-01-28 13:00:06 -05:00
Charles Gleason
81b6f8c3fc Add private is_empty method to RangeMut 2020-01-28 11:46:49 -05:00
Charles Gleason
3caa17b468
Format safety comment as per tidy
Co-Authored-By: Ashley Mannix <ashleymannix@live.com.au>
2020-01-28 11:27:31 -05:00
Billy Rieger
5654305a7b Add BTreeMap::remove_entry
Mainly for API parity with HashMap.

- Add BTreeMap::remove_entry
- Rewrite BTreeMap::remove to use remove_entry
- Use btreemap_remove_entry feature in doc comment
2020-01-28 00:43:18 -05:00
Tim Diekmann
7ca25db816
Rename Alloc to AllocRef 2020-01-27 21:39:51 +01:00
Mazdak Farrokhzad
d532a04a1c
Rollup merge of #67686 - ssomers:keys_start_slasher, r=Mark-Simulacrum
Simplify NodeHeader by avoiding slices in BTreeMaps with shared roots

Simplify a complicated piece of code that creates slices of keys in node leaves.
2020-01-21 19:42:17 +01:00
Stein Somers
3e947ef031 Declare unsafe functions that can no longer handle shared roots 2020-01-21 16:12:19 +01:00
Stein Somers
1b800a5671 trade in outdated comments for correct ones 2020-01-21 10:30:14 +01:00
Jonas Schievink
e5987a062f Format 2020-01-19 20:50:00 +01:00
Jonas Schievink
75f721df97 Move VecDeque Drain iterator to new file 2020-01-19 20:28:47 +01:00
Jonas Schievink
0ae16b47ff Avoid leak in DrainFilter when a drop panics 2020-01-19 20:24:36 +01:00
Jonas Schievink
b04ca13873 Fix leak in VecDeque::drain when drop panics 2020-01-19 20:24:08 +01:00
Jonas Schievink
dc492452da Fix leak in btree_map::IntoIter when drop panics 2020-01-19 20:24:08 +01:00
Jonas Schievink
3e5eb2634c Fix VecDeque::truncate leak on drop panic 2020-01-19 20:23:07 +01:00
Jonas Schievink
a859ca5c87 Fix binary_heap::DrainSorted drop leak on panics 2020-01-19 20:23:07 +01:00
Charles Lew
06b9a73cfa Update APIs according to RFC change suggestions. 2020-01-14 20:11:52 +08:00
Charles Lew
d2c509a3c6 Address review comments. 2020-01-12 18:34:35 +08:00
Charles Lew
091ba6daa0 Address review comments. 2020-01-12 13:15:00 +08:00
Charles Lew
d59e9b40a3 Implement Cursor for linked lists. (RFC 2570). 2020-01-12 01:51:04 +08:00
Stein Somers
9e90840a6a Simplify NodeHeader by avoiding slices in BTreeMaps with shared roots 2020-01-10 17:19:50 +01:00
Stein Somers
9b92bf8315
Apply suggestions from code review
Co-Authored-By: Ralf Jung <post@ralfj.de>
2020-01-09 12:03:49 +01:00
Stein Somers
37b5cca3d5 Simplify into_key_slice_mut and document bits and bobs 2020-01-09 11:45:32 +01:00
Stein Somers
92acdc8b89 Tweak and extend internal documentation, including debug asserts.
Co-Authored-By: Robin Kruppe <robin.kruppe@gmail.com>
2020-01-04 14:07:26 +01:00
bors
e39ae6f883 Auto merge of #67459 - ssomers:#67438, r=RalfJung
prune ill-conceived BTreeMap iter_mut assertion and test its mutability

Proposal to deal with #67438 (and I'm more sure now that this is the right thing to do).
Passes testing with miri.
2019-12-28 16:04:40 +00:00
Stein Somers
e3c814e623 prune ill-conceived BTreeMap iter_mut assertion and test more 2019-12-26 18:26:57 +01:00
Matthew Kraai
21e636f188 Remove redundant link texts 2019-12-26 05:04:46 -08:00
Charles Gleason
f547978392 Implement clone_from for BTree collections 2019-12-23 11:03:30 -05:00
Charles Gleason
293cdf7ac5 Make RangeMut::next_unchecked() output a mutable key reference 2019-12-23 11:03:30 -05:00
Mark Rousskov
a06baa56b9 Format the world 2019-12-22 17:42:47 -05:00
Ross MacArthur
f7256d28d1
Require issue = "none" over issue = "0" in unstable attributes 2019-12-21 13:16:18 +02:00
Mark Rousskov
82184440ec Propagate cfg bootstrap 2019-12-18 12:16:19 -05:00
bors
c8ea4ace92 Auto merge of #67136 - oli-obk:const_stability, r=Centril
Require stable/unstable annotations for the constness of all stable fns with a const modifier

r? @RalfJung @Centril

Every `#[stable]` const fn now needs either a `#[rustc_const_unstable]` attribute or a `#[rustc_const_stable]` attribute. You can't silently stabilize the constness of a function anymore.
2019-12-14 10:21:32 +00:00
Mazdak Farrokhzad
48164f8a17
Rollup merge of #67235 - jonas-schievink:vecdeque-leak, r=KodrAus
VecDeque: drop remaining items on destructor panic

Closes https://github.com/rust-lang/rust/issues/67232
2019-12-13 20:35:30 +01:00
Oliver Scherer
5e17e39881 Require stable/unstable annotations for the constness of all stable functions with a const modifier 2019-12-13 11:27:02 +01:00
Mazdak Farrokhzad
87f3b16e0b
Rollup merge of #67243 - jonas-schievink:linkedlist-drop, r=KodrAus
LinkedList: drop remaining items when drop panics

https://github.com/rust-lang/rust/pull/67235, but for `LinkedList`, which has the same issue.

I've also copied over the other drop-related tests from `VecDeque` since AFAICT `LinkedList` didn't have any.
2019-12-13 04:21:27 +01:00