about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2018-07-27 11:54:38 +0200
committerRalf Jung <post@ralfj.de>2018-07-27 11:54:38 +0200
commit3bc59b5205410b229eb66236b4aafbb90487fa34 (patch)
tree3b3eab19686334753b02e33d318d267d7a53b6c0 /src
parent70cb75c31e5d084da3a06457484096330ca72a61 (diff)
downloadrust-3bc59b5205410b229eb66236b4aafbb90487fa34.tar.gz
rust-3bc59b5205410b229eb66236b4aafbb90487fa34.zip
use slice::align_to
Diffstat (limited to 'src')
-rw-r--r--src/libcore/slice/memchr.rs33
1 files changed, 7 insertions, 26 deletions
diff --git a/src/libcore/slice/memchr.rs b/src/libcore/slice/memchr.rs
index dbbe1c07c23..72e7b57a6cb 100644
--- a/src/libcore/slice/memchr.rs
+++ b/src/libcore/slice/memchr.rs
@@ -102,32 +102,13 @@ pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
     let ptr = text.as_ptr();
     let usize_bytes = mem::size_of::<usize>();
 
-    // a version of align_offset that says how much must be *subtracted*
-    // from a pointer to be aligned.
-    #[inline(always)]
-    fn align_offset_down(ptr: *const u8, align: usize) -> usize {
-        let align_offset = ptr.align_offset(align);
-        if align_offset > align {
-            // Not possible to align
-            usize::max_value()
-        } else if align_offset == 0 {
-            0
-        } else {
-            // E.g. if align=8 and we have to add 1, then we can also subtract 7.
-            align - align_offset
-        }
-    }
-
-    // search to an aligned boundary
-    let end_align = align_offset_down(unsafe { ptr.offset(len as isize) }, usize_bytes);
-    let mut offset;
-    if end_align > 0 {
-        offset = if end_align >= len { 0 } else { len - end_align };
-        if let Some(index) = text[offset..].iter().rposition(|elt| *elt == x) {
-            return Some(offset + index);
-        }
-    } else {
-        offset = len;
+    let mut offset = {
+        // We call this just to obtain the length of the suffix
+        let (_, _, suffix) = unsafe { text.align_to::<usize>() };
+        len - suffix.len()
+    };
+    if let Some(index) = text[offset..].iter().rposition(|elt| *elt == x) {
+        return Some(offset + index);
     }
 
     // search the body of the text