ntex_bytes/bvec.rs
1use std::{borrow::Borrow, borrow::BorrowMut, fmt, io, ops::Deref, ops::DerefMut, ptr};
2
3use crate::{Buf, BufMut, Bytes, buf::IntoIter, buf::UninitSlice, storage::StorageVec};
4
5/// A unique reference to a contiguous slice of memory.
6///
7/// `BytesMut` represents a unique view into a potentially shared memory region.
8/// Given the uniqueness guarantee, owners of `BytesMut` handles are able to
9/// mutate the memory. It is similar to a `Vec<u8>` but with less copies and
10/// allocations. It also always allocates.
11///
12/// For more detail, see [Bytes](struct.Bytes.html).
13///
14/// # Growth
15///
16/// One key difference from `Vec<u8>` is that most operations **do not
17/// implicitly grow the buffer**. This means that calling `my_bytes.put("hello
18/// world");` could panic if `my_bytes` does not have enough capacity. Before
19/// writing to the buffer, ensure that there is enough remaining capacity by
20/// calling `my_bytes.remaining_mut()`. In general, avoiding calls to `reserve`
21/// is preferable.
22///
23/// The only exception is `extend` which implicitly reserves required capacity.
24///
25/// # Examples
26///
27/// ```
28/// use ntex_bytes::{BytesMut, BufMut};
29///
30/// let mut buf = BytesMut::with_capacity(64);
31///
32/// buf.put_u8(b'h');
33/// buf.put_u8(b'e');
34/// buf.put("llo");
35///
36/// assert_eq!(&buf[..], b"hello");
37///
38/// // Freeze the buffer so that it can be shared
39/// let a = buf.freeze();
40///
41/// // This does not allocate, instead `b` points to the same memory.
42/// let b = a.clone();
43///
44/// assert_eq!(a, b"hello");
45/// assert_eq!(b, b"hello");
46/// ```
47pub struct BytesMut {
48 pub(crate) storage: StorageVec,
49}
50
51impl BytesMut {
52 /// Creates a new `BytesMut` with the specified capacity.
53 ///
54 /// The returned `BytesMut` will be able to hold `capacity` bytes
55 /// without reallocating.
56 ///
57 /// It is important to note that this function does not specify the length
58 /// of the returned `BytesMut`, but only the capacity.
59 ///
60 /// # Panics
61 ///
62 /// Panics if `capacity` greater than 60bit for 64bit systems
63 /// and 28bit for 32bit systems
64 ///
65 /// # Examples
66 ///
67 /// ```
68 /// use ntex_bytes::{BytesMut, BufMut};
69 ///
70 /// let mut bytes = BytesMut::with_capacity(64);
71 ///
72 /// // `bytes` contains no data, even though there is capacity
73 /// assert_eq!(bytes.len(), 0);
74 ///
75 /// bytes.put(&b"hello world"[..]);
76 ///
77 /// assert_eq!(&bytes[..], b"hello world");
78 /// ```
79 #[inline]
80 #[must_use]
81 pub fn with_capacity(capacity: usize) -> BytesMut {
82 BytesMut {
83 storage: StorageVec::with_capacity(capacity),
84 }
85 }
86
87 /// Creates a new `BytesMut` from slice, by copying it.
88 #[inline]
89 #[must_use]
90 pub fn copy_from_slice<T: AsRef<[u8]>>(src: T) -> Self {
91 let slice = src.as_ref();
92 BytesMut {
93 storage: StorageVec::from_slice(slice.len(), slice),
94 }
95 }
96
97 /// Creates a new `BytesMut` with default capacity.
98 ///
99 /// Resulting object has length 0 and unspecified capacity.
100 ///
101 /// # Examples
102 ///
103 /// ```
104 /// use ntex_bytes::{BytesMut, BufMut};
105 ///
106 /// let mut bytes = BytesMut::new();
107 ///
108 /// assert_eq!(0, bytes.len());
109 ///
110 /// bytes.reserve(2);
111 /// bytes.put_slice(b"xy");
112 ///
113 /// assert_eq!(&b"xy"[..], &bytes[..]);
114 /// ```
115 #[inline]
116 #[must_use]
117 pub fn new() -> BytesMut {
118 BytesMut {
119 storage: StorageVec::with_capacity(crate::storage::MIN_CAPACITY),
120 }
121 }
122
123 /// Returns the number of bytes contained in this `BytesMut`.
124 ///
125 /// # Examples
126 ///
127 /// ```
128 /// use ntex_bytes::BytesMut;
129 ///
130 /// let b = BytesMut::copy_from_slice(&b"hello"[..]);
131 /// assert_eq!(b.len(), 5);
132 /// ```
133 #[inline]
134 pub fn len(&self) -> usize {
135 self.storage.len()
136 }
137
138 /// Returns true if the `BytesMut` has a length of 0.
139 ///
140 /// # Examples
141 ///
142 /// ```
143 /// use ntex_bytes::BytesMut;
144 ///
145 /// let b = BytesMut::with_capacity(64);
146 /// assert!(b.is_empty());
147 /// ```
148 #[inline]
149 pub fn is_empty(&self) -> bool {
150 self.storage.len() == 0
151 }
152
153 /// Returns the number of bytes the `BytesMut` can hold without reallocating.
154 ///
155 /// # Examples
156 ///
157 /// ```
158 /// use ntex_bytes::BytesMut;
159 ///
160 /// let b = BytesMut::with_capacity(64);
161 /// assert_eq!(b.capacity(), 64);
162 /// ```
163 #[inline]
164 pub fn capacity(&self) -> usize {
165 self.storage.capacity()
166 }
167
168 /// Converts `self` into an immutable `Bytes`.
169 ///
170 /// The conversion is zero cost and is used to indicate that the slice
171 /// referenced by the handle will no longer be mutated. Once the conversion
172 /// is done, the handle can be cloned and shared across threads.
173 ///
174 /// # Examples
175 ///
176 /// ```
177 /// use ntex_bytes::{BytesMut, BufMut};
178 /// use std::thread;
179 ///
180 /// let mut b = BytesMut::with_capacity(64);
181 /// b.put("hello world");
182 /// let b1 = b.freeze();
183 /// let b2 = b1.clone();
184 ///
185 /// let th = thread::spawn(move || {
186 /// assert_eq!(b1, b"hello world");
187 /// });
188 ///
189 /// assert_eq!(b2, b"hello world");
190 /// th.join().unwrap();
191 /// ```
192 #[inline]
193 #[must_use]
194 pub fn freeze(self) -> Bytes {
195 Bytes {
196 storage: self.storage.freeze(),
197 }
198 }
199
200 /// Removes the bytes from the current view, returning them in a
201 /// `Bytes` instance.
202 ///
203 /// Afterwards, `self` will be empty, but will retain any additional
204 /// capacity that it had before the operation. This is identical to
205 /// `self.split_to(self.len())`.
206 ///
207 /// This is an `O(1)` operation that just increases the reference count and
208 /// sets a few indices.
209 ///
210 /// # Examples
211 ///
212 /// ```
213 /// use ntex_bytes::{BytesMut, BufMut};
214 ///
215 /// let mut buf = BytesMut::with_capacity(1024);
216 /// buf.put(&b"hello world"[..]);
217 ///
218 /// let other = buf.take();
219 ///
220 /// assert!(buf.is_empty());
221 /// assert_eq!(1013, buf.capacity());
222 ///
223 /// assert_eq!(other, b"hello world"[..]);
224 /// ```
225 #[inline]
226 #[must_use]
227 pub fn take(&mut self) -> Bytes {
228 Bytes {
229 storage: self.storage.split_to(self.len()),
230 }
231 }
232
233 /// Splits the buffer into two at the given index.
234 ///
235 /// Afterwards `self` contains elements `[at, len)`, and the returned `Bytes`
236 /// contains elements `[0, at)`.
237 ///
238 /// This is an `O(1)` operation that just increases the reference count and
239 /// sets a few indices.
240 ///
241 /// # Examples
242 ///
243 /// ```
244 /// use ntex_bytes::BytesMut;
245 ///
246 /// let mut a = BytesMut::copy_from_slice(&b"hello world"[..]);
247 /// let mut b = a.split_to(5);
248 ///
249 /// a[0] = b'!';
250 ///
251 /// assert_eq!(&a[..], b"!world");
252 /// assert_eq!(&b[..], b"hello");
253 /// ```
254 ///
255 /// # Panics
256 ///
257 /// Panics if `at > len`.
258 #[inline]
259 #[must_use]
260 pub fn split_to(&mut self, at: usize) -> Bytes {
261 self.split_to_checked(at)
262 .expect("at value must be <= self.len()`")
263 }
264
265 /// Advance the internal cursor.
266 ///
267 /// Afterwards `self` contains elements `[cnt, len)`.
268 /// This is an `O(1)` operation.
269 ///
270 /// # Examples
271 ///
272 /// ```
273 /// use ntex_bytes::BytesMut;
274 ///
275 /// let mut a = BytesMut::copy_from_slice(&b"hello world"[..]);
276 /// a.advance_to(5);
277 ///
278 /// a[0] = b'!';
279 ///
280 /// assert_eq!(&a[..], b"!world");
281 /// ```
282 ///
283 /// # Panics
284 ///
285 /// Panics if `cnt > len`.
286 #[inline]
287 pub fn advance_to(&mut self, cnt: usize) {
288 unsafe {
289 self.storage.set_start(cnt as u32);
290 }
291 }
292
293 /// Splits the bytes into two at the given index.
294 ///
295 /// Does nothing if `at > len`.
296 #[inline]
297 #[must_use]
298 pub fn split_to_checked(&mut self, at: usize) -> Option<Bytes> {
299 if at <= self.len() {
300 Some(Bytes {
301 storage: self.storage.split_to(at),
302 })
303 } else {
304 None
305 }
306 }
307
308 /// Shortens the buffer, keeping the first `len` bytes and dropping the
309 /// rest.
310 ///
311 /// If `len` is greater than the buffer's current length, this has no
312 /// effect.
313 ///
314 /// The [`split_off`] method can emulate `truncate`, but this causes the
315 /// excess bytes to be returned instead of dropped.
316 ///
317 /// # Examples
318 ///
319 /// ```
320 /// use ntex_bytes::BytesMut;
321 ///
322 /// let mut buf = BytesMut::copy_from_slice(&b"hello world"[..]);
323 /// buf.truncate(5);
324 /// assert_eq!(buf, b"hello"[..]);
325 /// ```
326 ///
327 /// [`split_off`]: #method.split_off
328 #[inline]
329 pub fn truncate(&mut self, len: usize) {
330 self.storage.truncate(len);
331 }
332
333 /// Clears the buffer, removing all data.
334 ///
335 /// # Examples
336 ///
337 /// ```
338 /// use ntex_bytes::BytesMut;
339 ///
340 /// let mut buf = BytesMut::copy_from_slice(&b"hello world"[..]);
341 /// buf.clear();
342 /// assert!(buf.is_empty());
343 /// ```
344 #[inline]
345 pub fn clear(&mut self) {
346 self.truncate(0);
347 }
348
349 /// Resizes the buffer so that `len` is equal to `new_len`.
350 ///
351 /// If `new_len` is greater than `len`, the buffer is extended by the
352 /// difference with each additional byte set to `value`. If `new_len` is
353 /// less than `len`, the buffer is simply truncated.
354 ///
355 /// # Panics
356 ///
357 /// Panics if `new_len` greater than 60bit for 64bit systems
358 /// and 28bit for 32bit systems
359 ///
360 /// # Examples
361 ///
362 /// ```
363 /// use ntex_bytes::BytesMut;
364 ///
365 /// let mut buf = BytesMut::new();
366 ///
367 /// buf.resize(3, 0x1);
368 /// assert_eq!(&buf[..], &[0x1, 0x1, 0x1]);
369 ///
370 /// buf.resize(2, 0x2);
371 /// assert_eq!(&buf[..], &[0x1, 0x1]);
372 ///
373 /// buf.resize(4, 0x3);
374 /// assert_eq!(&buf[..], &[0x1, 0x1, 0x3, 0x3]);
375 /// ```
376 #[inline]
377 pub fn resize(&mut self, new_len: usize, value: u8) {
378 self.storage.resize(new_len, value);
379 }
380
381 /// Sets the length of the buffer.
382 ///
383 /// This will explicitly set the size of the buffer without actually
384 /// modifying the data, so it is up to the caller to ensure that the data
385 /// has been initialized.
386 ///
387 /// # Examples
388 ///
389 /// ```
390 /// use ntex_bytes::BytesMut;
391 ///
392 /// let mut b = BytesMut::copy_from_slice(&b"hello world"[..]);
393 ///
394 /// unsafe {
395 /// b.set_len(5);
396 /// }
397 ///
398 /// assert_eq!(&b[..], b"hello");
399 ///
400 /// unsafe {
401 /// b.set_len(11);
402 /// }
403 ///
404 /// assert_eq!(&b[..], b"hello world");
405 /// ```
406 ///
407 /// # Safety
408 ///
409 /// Caller must ensure that data has been initialized.
410 ///
411 /// # Panics
412 ///
413 /// This method will panic if `len` is out of bounds for the underlying
414 /// slice or if it comes after the `end` of the configured window.
415 #[inline]
416 pub unsafe fn set_len(&mut self, len: usize) {
417 self.storage.set_len(len);
418 }
419
420 /// Reserves capacity for at least `additional` more bytes to be inserted
421 /// into the given `BytesMut`.
422 ///
423 /// Before allocating new buffer space, the function will attempt to reclaim
424 /// space in the existing buffer. If the current handle references a small
425 /// view in the original buffer and all other handles have been dropped,
426 /// and the requested capacity is less than or equal to the existing
427 /// buffer's capacity, then the current view will be copied to the front of
428 /// the buffer and the handle will take ownership of the full buffer.
429 ///
430 /// # Panics
431 ///
432 /// Panics if new capacity is greater than 60bit for 64bit systems
433 /// and 28bit for 32bit systems
434 ///
435 /// # Examples
436 ///
437 /// In the following example, a new buffer is allocated.
438 ///
439 /// ```
440 /// use ntex_bytes::BytesMut;
441 ///
442 /// let mut buf = BytesMut::copy_from_slice(&b"hello"[..]);
443 /// buf.reserve(64);
444 /// assert!(buf.capacity() >= 69);
445 /// ```
446 ///
447 /// In the following example, the existing buffer is reclaimed.
448 ///
449 /// ```
450 /// use ntex_bytes::{BytesMut, BufMut};
451 ///
452 /// let mut buf = BytesMut::with_capacity(128);
453 /// buf.put(&[0; 64][..]);
454 ///
455 /// let ptr = buf.as_ptr();
456 /// let other = buf.take();
457 ///
458 /// assert!(buf.is_empty());
459 /// assert_eq!(buf.capacity(), 64);
460 ///
461 /// drop(other);
462 /// buf.reserve(128);
463 ///
464 /// assert_eq!(buf.capacity(), 128);
465 /// assert_eq!(buf.as_ptr(), ptr);
466 /// ```
467 ///
468 /// # Panics
469 ///
470 /// Panics if the new capacity overflows `usize`.
471 #[inline]
472 pub fn reserve(&mut self, additional: usize) {
473 self.storage.reserve(additional);
474 }
475
476 /// Reserves capacity for inserting additional bytes into the given `BytesMut`.
477 ///
478 /// This is equivalent to calling
479 /// `BytesMut::reserve(capacity - BytesMut::remaining_mut())`.
480 ///
481 /// # Panics
482 ///
483 /// Panics if new capacity is greater than 60bit for 64bit systems
484 /// and 28bit for 32bit systems
485 ///
486 /// # Examples
487 ///
488 /// In the following example, a new buffer is allocated.
489 ///
490 /// ```
491 /// use ntex_bytes::BytesMut;
492 ///
493 /// let mut buf = BytesMut::copy_from_slice(&b"hello"[..]);
494 /// buf.reserve_capacity(128);
495 /// assert!(buf.capacity() >= 128);
496 /// assert!(buf.len() >= 5);
497 /// ```
498 #[inline]
499 pub fn reserve_capacity(&mut self, cap: usize) {
500 self.storage.reserve_capacity(cap);
501 }
502
503 /// Appends given bytes to this object.
504 ///
505 /// If this `BytesMut` object has not enough capacity, it is resized first.
506 /// So unlike `put_slice` operation, `extend_from_slice` does not panic.
507 ///
508 /// # Examples
509 ///
510 /// ```
511 /// use ntex_bytes::BytesMut;
512 ///
513 /// let mut buf = BytesMut::with_capacity(0);
514 /// buf.extend_from_slice(b"aaabbb");
515 /// buf.extend_from_slice(b"cccddd");
516 ///
517 /// assert_eq!(b"aaabbbcccddd", &buf[..]);
518 /// ```
519 #[inline]
520 pub fn extend_from_slice(&mut self, extend: &[u8]) {
521 self.put_slice(extend);
522 }
523
524 /// Returns an iterator over the bytes contained by the buffer.
525 ///
526 /// # Examples
527 ///
528 /// ```
529 /// use ntex_bytes::{Buf, BytesMut};
530 ///
531 /// let buf = BytesMut::copy_from_slice(&b"abc"[..]);
532 /// let mut iter = buf.iter();
533 ///
534 /// assert_eq!(iter.next().map(|b| *b), Some(b'a'));
535 /// assert_eq!(iter.next().map(|b| *b), Some(b'b'));
536 /// assert_eq!(iter.next().map(|b| *b), Some(b'c'));
537 /// assert_eq!(iter.next(), None);
538 /// ```
539 #[inline]
540 pub fn iter(&'_ self) -> std::slice::Iter<'_, u8> {
541 self.chunk().iter()
542 }
543}
544
545impl Buf for BytesMut {
546 #[inline]
547 fn remaining(&self) -> usize {
548 self.len()
549 }
550
551 #[inline]
552 fn chunk(&self) -> &[u8] {
553 self.storage.as_ref()
554 }
555
556 #[inline]
557 fn advance(&mut self, cnt: usize) {
558 self.advance_to(cnt);
559 }
560}
561
562impl BufMut for BytesMut {
563 #[inline]
564 fn remaining_mut(&self) -> usize {
565 self.storage.remaining()
566 }
567
568 #[inline]
569 unsafe fn advance_mut(&mut self, cnt: usize) {
570 // This call will panic if `cnt` is too big
571 self.storage.set_len(self.len() + cnt);
572 }
573
574 #[inline]
575 fn chunk_mut(&mut self) -> &mut UninitSlice {
576 unsafe {
577 // This will never panic as `len` can never become invalid
578 let ptr = &mut self.storage.as_ptr();
579 UninitSlice::from_raw_parts_mut(ptr.add(self.len()), self.remaining_mut())
580 }
581 }
582
583 #[inline]
584 fn put_slice(&mut self, src: &[u8]) {
585 let len = src.len();
586 self.reserve(len);
587
588 unsafe {
589 ptr::copy_nonoverlapping(src.as_ptr(), self.chunk_mut().as_mut_ptr(), len);
590 self.advance_mut(len);
591 }
592 }
593
594 #[inline]
595 fn put_u8(&mut self, n: u8) {
596 self.reserve(1);
597 self.storage.put_u8(n);
598 }
599
600 #[inline]
601 fn put_i8(&mut self, n: i8) {
602 self.put_u8(n as u8);
603 }
604}
605
606impl bytes::buf::Buf for BytesMut {
607 #[inline]
608 fn remaining(&self) -> usize {
609 self.len()
610 }
611
612 #[inline]
613 fn chunk(&self) -> &[u8] {
614 self.storage.as_ref()
615 }
616
617 #[inline]
618 fn advance(&mut self, cnt: usize) {
619 self.advance_to(cnt);
620 }
621}
622
623unsafe impl bytes::buf::BufMut for BytesMut {
624 #[inline]
625 fn remaining_mut(&self) -> usize {
626 BufMut::remaining_mut(self)
627 }
628
629 #[inline]
630 unsafe fn advance_mut(&mut self, cnt: usize) {
631 BufMut::advance_mut(self, cnt);
632 }
633
634 #[inline]
635 fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice {
636 unsafe {
637 // This will never panic as `len` can never become invalid
638 let ptr = self.storage.as_ptr();
639 bytes::buf::UninitSlice::from_raw_parts_mut(
640 ptr.add(self.len()),
641 BufMut::remaining_mut(self),
642 )
643 }
644 }
645
646 #[inline]
647 fn put_slice(&mut self, src: &[u8]) {
648 BufMut::put_slice(self, src);
649 }
650
651 #[inline]
652 fn put_u8(&mut self, n: u8) {
653 BufMut::put_u8(self, n);
654 }
655
656 #[inline]
657 fn put_i8(&mut self, n: i8) {
658 BufMut::put_i8(self, n);
659 }
660}
661
662impl AsRef<[u8]> for BytesMut {
663 #[inline]
664 fn as_ref(&self) -> &[u8] {
665 self.storage.as_ref()
666 }
667}
668
669impl AsMut<[u8]> for BytesMut {
670 #[inline]
671 fn as_mut(&mut self) -> &mut [u8] {
672 self.storage.as_mut()
673 }
674}
675
676impl Deref for BytesMut {
677 type Target = [u8];
678
679 #[inline]
680 fn deref(&self) -> &[u8] {
681 self.as_ref()
682 }
683}
684
685impl DerefMut for BytesMut {
686 #[inline]
687 fn deref_mut(&mut self) -> &mut [u8] {
688 self.storage.as_mut()
689 }
690}
691
692impl Eq for BytesMut {}
693
694impl PartialEq for BytesMut {
695 #[inline]
696 fn eq(&self, other: &BytesMut) -> bool {
697 self.storage.as_ref() == other.storage.as_ref()
698 }
699}
700
701impl Default for BytesMut {
702 #[inline]
703 fn default() -> BytesMut {
704 BytesMut::new()
705 }
706}
707
708impl Borrow<[u8]> for BytesMut {
709 #[inline]
710 fn borrow(&self) -> &[u8] {
711 self.as_ref()
712 }
713}
714
715impl BorrowMut<[u8]> for BytesMut {
716 #[inline]
717 fn borrow_mut(&mut self) -> &mut [u8] {
718 self.as_mut()
719 }
720}
721
722impl PartialEq<Bytes> for BytesMut {
723 fn eq(&self, other: &Bytes) -> bool {
724 other[..] == self[..]
725 }
726}
727
728impl fmt::Debug for BytesMut {
729 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
730 fmt::Debug::fmt(&crate::debug::BsDebug(self.storage.as_ref()), fmt)
731 }
732}
733
734impl fmt::Write for BytesMut {
735 #[inline]
736 fn write_str(&mut self, s: &str) -> fmt::Result {
737 self.extend_from_slice(s.as_bytes());
738 Ok(())
739 }
740}
741
742impl io::Write for BytesMut {
743 fn write(&mut self, src: &[u8]) -> Result<usize, io::Error> {
744 self.extend_from_slice(src);
745 Ok(src.len())
746 }
747
748 fn flush(&mut self) -> Result<(), io::Error> {
749 Ok(())
750 }
751}
752
753impl Clone for BytesMut {
754 #[inline]
755 fn clone(&self) -> BytesMut {
756 BytesMut::from(&self[..])
757 }
758}
759
760impl IntoIterator for BytesMut {
761 type Item = u8;
762 type IntoIter = IntoIter<BytesMut>;
763
764 fn into_iter(self) -> Self::IntoIter {
765 IntoIter::new(self)
766 }
767}
768
769impl<'a> IntoIterator for &'a BytesMut {
770 type Item = &'a u8;
771 type IntoIter = std::slice::Iter<'a, u8>;
772
773 fn into_iter(self) -> Self::IntoIter {
774 self.as_ref().iter()
775 }
776}
777
778impl FromIterator<u8> for BytesMut {
779 fn from_iter<T: IntoIterator<Item = u8>>(into_iter: T) -> Self {
780 let iter = into_iter.into_iter();
781 let (min, maybe_max) = iter.size_hint();
782
783 let mut out = BytesMut::with_capacity(maybe_max.unwrap_or(min));
784 for i in iter {
785 out.reserve(1);
786 out.put_u8(i);
787 }
788
789 out
790 }
791}
792
793impl<'a> FromIterator<&'a u8> for BytesMut {
794 fn from_iter<T: IntoIterator<Item = &'a u8>>(into_iter: T) -> Self {
795 into_iter.into_iter().copied().collect::<BytesMut>()
796 }
797}
798
799impl Extend<u8> for BytesMut {
800 fn extend<T>(&mut self, iter: T)
801 where
802 T: IntoIterator<Item = u8>,
803 {
804 let iter = iter.into_iter();
805
806 let (lower, _) = iter.size_hint();
807 self.reserve(lower);
808
809 for (idx, b) in iter.enumerate() {
810 if idx >= lower {
811 self.reserve(1);
812 }
813 self.put_u8(b);
814 }
815 }
816}
817
818impl<'a> Extend<&'a u8> for BytesMut {
819 fn extend<T>(&mut self, iter: T)
820 where
821 T: IntoIterator<Item = &'a u8>,
822 {
823 self.extend(iter.into_iter().copied());
824 }
825}
826
827impl PartialEq<[u8]> for BytesMut {
828 fn eq(&self, other: &[u8]) -> bool {
829 &**self == other
830 }
831}
832
833impl<const N: usize> PartialEq<[u8; N]> for BytesMut {
834 fn eq(&self, other: &[u8; N]) -> bool {
835 &**self == other
836 }
837}
838
839impl PartialEq<BytesMut> for [u8] {
840 fn eq(&self, other: &BytesMut) -> bool {
841 *other == *self
842 }
843}
844
845impl<const N: usize> PartialEq<BytesMut> for [u8; N] {
846 fn eq(&self, other: &BytesMut) -> bool {
847 *other == *self
848 }
849}
850
851impl<const N: usize> PartialEq<BytesMut> for &[u8; N] {
852 fn eq(&self, other: &BytesMut) -> bool {
853 *other == *self
854 }
855}
856
857impl PartialEq<str> for BytesMut {
858 fn eq(&self, other: &str) -> bool {
859 &**self == other.as_bytes()
860 }
861}
862
863impl PartialEq<BytesMut> for str {
864 fn eq(&self, other: &BytesMut) -> bool {
865 *other == *self
866 }
867}
868
869impl PartialEq<Vec<u8>> for BytesMut {
870 fn eq(&self, other: &Vec<u8>) -> bool {
871 *self == other[..]
872 }
873}
874
875impl PartialEq<BytesMut> for Vec<u8> {
876 fn eq(&self, other: &BytesMut) -> bool {
877 *other == *self
878 }
879}
880
881impl PartialEq<String> for BytesMut {
882 fn eq(&self, other: &String) -> bool {
883 *self == other[..]
884 }
885}
886
887impl PartialEq<BytesMut> for String {
888 fn eq(&self, other: &BytesMut) -> bool {
889 *other == *self
890 }
891}
892
893impl<'a, T: ?Sized> PartialEq<&'a T> for BytesMut
894where
895 BytesMut: PartialEq<T>,
896{
897 fn eq(&self, other: &&'a T) -> bool {
898 *self == **other
899 }
900}
901
902impl PartialEq<BytesMut> for &[u8] {
903 fn eq(&self, other: &BytesMut) -> bool {
904 *other == *self
905 }
906}
907
908impl PartialEq<BytesMut> for &str {
909 fn eq(&self, other: &BytesMut) -> bool {
910 *other == *self
911 }
912}
913
914impl PartialEq<BytesMut> for Bytes {
915 fn eq(&self, other: &BytesMut) -> bool {
916 other[..] == self[..]
917 }
918}
919
920impl From<BytesMut> for Bytes {
921 #[inline]
922 fn from(b: BytesMut) -> Self {
923 b.freeze()
924 }
925}
926
927impl<'a> From<&'a [u8]> for BytesMut {
928 #[inline]
929 fn from(src: &'a [u8]) -> BytesMut {
930 BytesMut::copy_from_slice(src)
931 }
932}
933
934impl<const N: usize> From<[u8; N]> for BytesMut {
935 #[inline]
936 fn from(src: [u8; N]) -> BytesMut {
937 BytesMut::copy_from_slice(src)
938 }
939}
940
941impl<'a, const N: usize> From<&'a [u8; N]> for BytesMut {
942 #[inline]
943 fn from(src: &'a [u8; N]) -> BytesMut {
944 BytesMut::copy_from_slice(src)
945 }
946}
947
948impl<'a> From<&'a str> for BytesMut {
949 #[inline]
950 fn from(src: &'a str) -> BytesMut {
951 BytesMut::from(src.as_bytes())
952 }
953}
954
955impl From<Bytes> for BytesMut {
956 #[inline]
957 fn from(src: Bytes) -> BytesMut {
958 //src.try_mut().unwrap_or_else(|src| BytesMut::copy_from_slice(&src[..]))
959 BytesMut::copy_from_slice(&src[..])
960 }
961}
962
963impl From<&Bytes> for BytesMut {
964 #[inline]
965 fn from(src: &Bytes) -> BytesMut {
966 BytesMut::copy_from_slice(&src[..])
967 }
968}