From 6b624b849ab422840a3e87e8e8e7eac171df67d0 Mon Sep 17 00:00:00 2001
From: Carl Lerche <me@carllerche.com>
Date: Thu, 3 Dec 2015 19:57:08 -0800
Subject: [PATCH] Make MutBuf::advance unsafe

Closes #38
---
 src/buf/byte.rs  |  2 +-
 src/buf/mod.rs   | 13 ++++++-------
 src/buf/ring.rs  |  2 +-
 src/buf/slice.rs |  2 +-
 src/buf/take.rs  |  2 +-
 src/str/bytes.rs |  2 +-
 6 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/buf/byte.rs b/src/buf/byte.rs
index bf1e14a..46c2e6d 100644
--- a/src/buf/byte.rs
+++ b/src/buf/byte.rs
@@ -329,7 +329,7 @@ impl MutBuf for MutByteBuf {
         self.buf.remaining()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         self.buf.advance(cnt)
     }
 
diff --git a/src/buf/mod.rs b/src/buf/mod.rs
index a1539f4..9acb915 100644
--- a/src/buf/mod.rs
+++ b/src/buf/mod.rs
@@ -95,7 +95,7 @@ pub trait MutBuf : Sized {
     fn remaining(&self) -> usize;
 
     /// Advance the internal cursor of the MutBuf
-    fn advance(&mut self, cnt: usize);
+    unsafe fn advance(&mut self, cnt: usize);
 
     /// Returns true iff there is any more space for bytes to be written
     fn has_remaining(&self) -> bool {
@@ -143,9 +143,10 @@ pub trait MutBuf : Sized {
                     cnt);
 
                 off += cnt;
+
             }
 
-            self.advance(cnt);
+            unsafe { self.advance(cnt); }
         }
 
         len
@@ -278,7 +279,7 @@ impl<'a, R: io::Read+'a> Source for &'a mut R {
                 break;
             }
 
-            buf.advance(i);
+            unsafe { buf.advance(i); }
             cnt += i;
         }
 
@@ -338,7 +339,7 @@ impl MutBuf for Vec<u8> {
         usize::MAX - self.len()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         let len = self.len() + cnt;
 
         if len > self.capacity() {
@@ -348,9 +349,7 @@ impl MutBuf for Vec<u8> {
             self.reserve(cap - len);
         }
 
-        unsafe {
-            self.set_len(len);
-        }
+        self.set_len(len);
     }
 
     unsafe fn mut_bytes(&mut self) -> &mut [u8] {
diff --git a/src/buf/ring.rs b/src/buf/ring.rs
index 892b1ab..7308095 100644
--- a/src/buf/ring.rs
+++ b/src/buf/ring.rs
@@ -199,7 +199,7 @@ impl MutBuf for RingBuf {
         self.write_remaining()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         self.advance_writer(cnt)
     }
 
diff --git a/src/buf/slice.rs b/src/buf/slice.rs
index fb117ff..a526803 100644
--- a/src/buf/slice.rs
+++ b/src/buf/slice.rs
@@ -48,7 +48,7 @@ impl<'a> MutBuf for MutSliceBuf<'a> {
         self.bytes.len() - self.pos
     }
 
-    fn advance(&mut self, mut cnt: usize) {
+    unsafe fn advance(&mut self, mut cnt: usize) {
         cnt = cmp::min(cnt, self.remaining());
         self.pos += cnt;
     }
diff --git a/src/buf/take.rs b/src/buf/take.rs
index edc7237..7fec5b9 100644
--- a/src/buf/take.rs
+++ b/src/buf/take.rs
@@ -71,7 +71,7 @@ impl<T: MutBuf> MutBuf for Take<T> {
         &mut self.inner.mut_bytes()[..self.limit]
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         let cnt = cmp::min(cnt, self.limit);
         self.limit -= cnt;
         self.inner.advance(cnt);
diff --git a/src/str/bytes.rs b/src/str/bytes.rs
index 42e1756..d5bf409 100644
--- a/src/str/bytes.rs
+++ b/src/str/bytes.rs
@@ -220,7 +220,7 @@ impl<'a> Source for &'a Bytes {
             }
 
             src.advance(l);
-            dst.advance(l);
+            unsafe { dst.advance(l); }
 
             res += l;
         }
-- 
GitLab