Commit graph

357 commits

Author SHA1 Message Date
aticu
4127ed1732 Fix Safety docs for from_raw_parts_mut 2020-07-17 19:47:25 +02:00
Mark Rousskov
647d9b525f apply bootstrap cfgs 2020-07-16 19:36:49 -04:00
Manish Goregaokar
79894dfbac
Rollup merge of #73986 - RalfJung:raw-slice-as-ptr, r=sfackler
add (unchecked) indexing methods to raw (and NonNull) slices

This complements the existing (unstable) `len` method. Unfortunately, for non-null slices, we cannot call this method `as_ptr` as that overlaps with the existing method of the same name.

If this looks reasonable to accept, I propose to reuse the https://github.com/rust-lang/rust/issues/71146 tracking issue and rename the feature get to `slice_ptr_methods` or so.

Cc @SimonSapin
Fixes https://github.com/rust-lang/rust/issues/60639
2020-07-14 07:39:00 -07:00
Thom Chiovoloni
980d8e1a0b Optimize is_ascii for &str and &[u8] 2020-07-05 10:23:50 -07:00
Ralf Jung
90580c7b0e make unchecked slice indexing helper methods use raw pointers 2020-07-05 19:05:55 +02:00
Manish Goregaokar
500634bf10
Rollup merge of #73622 - LeSeulArtichaut:unsafe-libcore, r=nikomatsakis
Deny unsafe ops in unsafe fns in libcore

After `liballoc`, It's time for `libcore` :D

I planned to do this bit by bit to avoid having a big chunk of diffs, so to make reviews easier, and to make the unsafe blocks narrower and take the time to document them properly.

r? @nikomatsakis cc @RalfJung
2020-07-02 00:16:28 -07:00
Lzu Tao
cd9d8334bd Implement slice_strip feature 2020-07-01 12:36:42 +00:00
LeSeulArtichaut
a1623ff3b6 Deny unsafe ops in unsafe fns, part 6
And final part!!!
2020-06-30 19:28:51 +02:00
LeSeulArtichaut
b3652337a9 Deny unsafe ops in unsafe fns, part 5 2020-06-30 17:37:53 +02:00
LeSeulArtichaut
c68f478131 Deny unsafe ops in unsafe fns, part 4 2020-06-30 17:06:33 +02:00
Manish Goregaokar
ec4898977a
Rollup merge of #73577 - VillSnow:master, r=Amanieu
Add partition_point

Add partition_point in C++.
Although existing binary_search in rust does not suitable when the slice has multiple hits,
this function returns exact point of partition.
The definition of this function is very clear and able to accept general matter, therefore you can easily get index which you want like lower/upper_bound.

https://github.com/rust-lang/rfcs/issues/2184
2020-06-28 08:30:22 -07:00
VillSnow
6f8ad3b208
Update src/libcore/slice/mod.rs
Co-authored-by: Amanieu d'Antras <amanieu@gmail.com>
2020-06-28 21:31:05 +09:00
VillSnow
60f2ba2403 Update tracking issue number 2020-06-28 17:39:03 +09:00
VillSnow
d720a19e2a Update doc comment 2020-06-28 16:45:56 +09:00
VillSnow
83d599826f Merge branch 'master' of https://github.com/VillSnow/rust 2020-06-28 16:27:41 +09:00
VillSnow
9335787657
Update src/libcore/slice/mod.rs
Co-authored-by: Lukas Kalbertodt <lukas.kalbertodt@gmail.com>
2020-06-28 16:26:47 +09:00
VillSnow
52f976236f Add comment on use of unsafe 2020-06-28 16:25:33 +09:00
LeSeulArtichaut
2735f43cef
Fix links in SliceIndex documentation 2020-06-24 23:34:19 +02:00
Manish Goregaokar
ae38698e7f
Rollup merge of #73398 - oli-obk:const_raw_ptr_cmp, r=varkor,RalfJung,nagisa
A way forward for pointer equality in const eval

r? @varkor on the first commit and @RalfJung on the second commit

cc #53020
2020-06-23 00:33:54 -07:00
VillSnow
27b06f10dc update: doc comment 2020-06-22 21:35:09 +09:00
VillSnow
c9b4915705 fix: doc test 2020-06-21 18:54:55 +09:00
VillSnow
4c8ce48a15 Add partition_point 2020-06-21 13:52:26 +09:00
Oliver Scherer
98e97a46e2 Address review comments 2020-06-20 14:58:15 +02:00
Oliver Scherer
e09b620339 Add fuzzy pointer comparison intrinsics 2020-06-19 18:13:41 +02:00
Hanif Bin Ariffin
5a9df8406f Added some more documentations to unsafety blocks in slice/sort.rs 2020-06-16 16:19:49 -04:00
Hanif Bin Ariffin
c710461b02 Added some unsafety documentation to partition_equal 2020-06-13 15:06:22 -04:00
Hanif Bin Ariffin
c471519b99 Added unsafety documentation with partition and partition equal
These are simply indexing safety.
2020-06-13 15:06:22 -04:00
Hanif Bin Ariffin
9e1e989f7c Document unsafety in partial_insertion_sort
We already implicitly (or explicitly??) do the bound checking for the indexing.
2020-06-13 15:06:22 -04:00
Hanif Bin Ariffin
9e8b42c02b Added unsafety documentation to shift_tail
This is just the reverse of shift_head.
2020-06-13 15:06:22 -04:00
Hanif Bin Ariffin
7349f2c6a3 Added unsafety documentation to shift_head 2020-06-13 15:06:22 -04:00
Dylan DPC
c06799e4c4
Rollup merge of #72906 - lzutao:migrate-numeric-assoc-consts, r=dtolnay
Migrate to numeric associated consts

The deprecation PR is #72885

cc #68490
cc rust-lang/rfcs#2700
2020-06-12 12:28:23 +02:00
Lzu Tao
fff822fead Migrate to numeric associated consts 2020-06-10 01:35:47 +00:00
Stanislav Tkach
54fdb578c6
Fix the typo (size of the size) 2020-06-08 19:13:46 +03:00
JOE1994
dd0338fbac Clarify terms in doc comments
Doc comments of 'copy_from_slice' say that people should use 'clone_from_slice'
when 'src' doesn't implement 'Copy'. However, 'src' is a reference and
it always implements 'Copy'. The term 'src' should be fixed to 'T' in
the doc comments.

Thank you for reviewing this PR :)
2020-05-31 14:37:26 -04:00
Kagami Sascha Rosylight
df2f9a4bd1
Use sort_unstable_by in its own docs 2020-05-24 14:56:57 +02:00
Ralf Jung
67e075589b
Typo 2020-05-21 19:07:59 +02:00
Daniel Henry-Mantilla
a81e9a781b Improve documentation of slice::from_raw_parts
This is to provide a more explicit statement against a code pattern that
many people end up coming with, since the reason of it being unsound
comes from the badly known single-allocation validity rule.

Providing that very pattern as a counter-example could help mitigate that.

Co-authored-by: Ralf Jung <post@ralfj.de>
2020-05-21 18:38:41 +02:00
Pyry Kontio
46159b3610 split_inclusive: add tracking issue number (72360) 2020-05-20 04:22:37 +09:00
Nicholas Nethercote
5a0ac0552e Use simpler impls for some Iterator methods for slices.
The default implementations of several `Iterator` methods use `fold` or
`try_fold`, which works, but is overkill for slices and bloats the
amount of LLVM IR generated and consequently hurts compile times.

This commit adds the simple, obvious implementations for `for_each`,
`all`, `any`, `find`, `find_map`, and simplifies the existing
implementations for `position` and `rposition`. These changes reduce
compile times significantly on some benchmarks.
2020-05-13 15:47:19 +10:00
Bastian Kauschke
902aa62d51 slice::fill: take T by value. 2020-05-02 20:15:05 +02:00
Mark Rousskov
93eed402ad Bump bootstrap compiler 2020-04-25 09:25:33 -04:00
Linus Färnstrand
9fc0833235 Stop accessing module level int consts via crate::<Ty> 2020-04-20 23:38:06 +02:00
Ralf Jung
88612e3657 big-O notation: parenthesis, multiplication and backticks 2020-04-15 14:33:45 +02:00
mi_sawa
408dc36980 Tighten time complexity on the doc 2020-04-14 23:51:03 +09:00
Dylan DPC
6ea27010b5
Rollup merge of #70752 - yoshuawuyts:slice_fill, r=dtolnay
Add slice::fill

Adds the `slice::fill` method to fill a slice with an item. This replaces manual for loops where items are copied one-by-one. This is a counterpart to C++20's [`std::fill`](https://en.cppreference.com/w/cpp/algorithm/fill) function.

## Usage

```rust
let mut buf = vec![0; 10];
buf.fill(1);
assert_eq!(buf, vec![1; 10]);
```

## Performance

When compiling in release mode, for `[u8]` and `[u16]` this method will optimize to a `memset(3)` call ([godbolt](https://godbolt.org/z/85El_c)). The initial implementation relies on LLVM's optimizer to make it as fast as possible for any given input. But as @jonas-schievink [pointed out](https://twitter.com/sheevink/status/1245756597453885442) this can later be optimized through specialization to guarantee it has a specific performance profile.

## Why now?

Conversations about adding `slice::fill` are not new. In fact, https://github.com/rust-lang/rfcs/issues/2067 was opened 3 years ago about this exact topic. However discussion stranded while discussing implementation details, and it's not seen much forward motion since.

In ["The Hunt for the Fastest Zero"](https://travisdowns.github.io/blog/2020/01/20/zero.html) Travis Downs provides disects C++'s `std::fill` performance profile on gcc, comparing it among others to `memset(3)`. Even though `memset(3)` outperforms `std::fill` in their tests, the author notes the following:

>  That the optimization fails, perhaps unexpectedly, in some cases is unfortunate but it’s nice that you can fix it yourself. [...] Do we throw out modern C++ idioms, at least where performance matters, for example by replacing std::fill with memset? I don’t think so.

Much of the article focuses on how how to fix the performance of `std::fill` by providing specializations for specific input. In Rust we don't have any dedicated methods to fill slices with values, so it either needs to be optimized at the MIR layer, or more likely rely on LLVM's optimizer.

By adding a dedicated method for filling slices with values it opens up the ability for us to in the future guarantee that e.g. `Vec<u8>` will always optimize to `memset` even in debug mode. Or perhaps provide stronger guarantees about memory when zeroing values when a certain flag is passed. But regardless of that, it improves general ergonomics of working with slices by providing a dedicated method with documentation and examples.

## References
- [slice-fill prototype on docs.rs](https://docs.rs/slice-fill/1.0.1/slice_fill/)
- [The Hunt For The Fastest Zero](https://travisdowns.github.io/blog/2020/01/20/zero.html)
- [Safe memset for slices](https://github.com/rust-lang/rfcs/issues/2067)
- [C++20 std::fill](https://en.cppreference.com/w/cpp/algorithm/fill)
- [ASM output on Godbolt](https://godbolt.org/z/5-XU66)
2020-04-05 06:44:45 +02:00
Yoshua Wuyts
edabceb4a3 Add slice::fill 2020-04-05 01:44:02 +02:00
Linus Färnstrand
c831265940 Replace float module consts with assoc consts in documentation 2020-04-03 09:33:10 +02:00
Adam Perry
a7ab7b136e #[track_caller] on core::ops::{Index, IndexMut}. 2020-03-23 08:01:49 -07:00
Josh Stone
53be0ccbc9 Use subslice patterns in slice methods
For all of the methods that pick off the first or last element, we can
use subslice patterns to implement them directly, rather than relying on
deeper indexing function calls. At a minimum, this means the generated
code will rely less on inlining for performance, but in some cases it
also optimizes better.
2020-03-04 10:34:24 -08:00
Dylan DPC
02381db8e0
Rollup merge of #69581 - RalfJung:align_to_mut, r=Centril
fix aliasing violation in align_to_mut

Fixes https://github.com/rust-lang/rust/issues/68549

I decided to add the testcase here to make it all one PR, but if you prefer I can also add that test case in the Miri repo instead.
2020-02-29 18:54:02 +01:00