bytes/buf/
buf_mut.rs

1use crate::buf::{limit, Chain, Limit, UninitSlice};
2#[cfg(feature = "std")]
3use crate::buf::{writer, Writer};
4use crate::{panic_advance, panic_does_not_fit};
5
6use core::{mem, ptr, usize};
7
8use alloc::{boxed::Box, vec::Vec};
9
10/// A trait for values that provide sequential write access to bytes.
11///
12/// Write bytes to a buffer
13///
14/// A buffer stores bytes in memory such that write operations are infallible.
15/// The underlying storage may or may not be in contiguous memory. A `BufMut`
16/// value is a cursor into the buffer. Writing to `BufMut` advances the cursor
17/// position.
18///
19/// The simplest `BufMut` is a `Vec<u8>`.
20///
21/// ```
22/// use bytes::BufMut;
23///
24/// let mut buf = vec![];
25///
26/// buf.put(&b"hello world"[..]);
27///
28/// assert_eq!(buf, b"hello world");
29/// ```
30pub unsafe trait BufMut {
31    /// Returns the number of bytes that can be written from the current
32    /// position until the end of the buffer is reached.
33    ///
34    /// This value is greater than or equal to the length of the slice returned
35    /// by `chunk_mut()`.
36    ///
37    /// Writing to a `BufMut` may involve allocating more memory on the fly.
38    /// Implementations may fail before reaching the number of bytes indicated
39    /// by this method if they encounter an allocation failure.
40    ///
41    /// # Examples
42    ///
43    /// ```
44    /// use bytes::BufMut;
45    ///
46    /// let mut dst = [0; 10];
47    /// let mut buf = &mut dst[..];
48    ///
49    /// let original_remaining = buf.remaining_mut();
50    /// buf.put(&b"hello"[..]);
51    ///
52    /// assert_eq!(original_remaining - 5, buf.remaining_mut());
53    /// ```
54    ///
55    /// # Implementer notes
56    ///
57    /// Implementations of `remaining_mut` should ensure that the return value
58    /// does not change unless a call is made to `advance_mut` or any other
59    /// function that is documented to change the `BufMut`'s current position.
60    ///
61    /// # Note
62    ///
63    /// `remaining_mut` may return value smaller than actual available space.
64    fn remaining_mut(&self) -> usize;
65
66    /// Advance the internal cursor of the BufMut
67    ///
68    /// The next call to `chunk_mut` will return a slice starting `cnt` bytes
69    /// further into the underlying buffer.
70    ///
71    /// # Safety
72    ///
73    /// The caller must ensure that the next `cnt` bytes of `chunk` are
74    /// initialized.
75    ///
76    /// # Examples
77    ///
78    /// ```
79    /// use bytes::BufMut;
80    ///
81    /// let mut buf = Vec::with_capacity(16);
82    ///
83    /// // Write some data
84    /// buf.chunk_mut()[0..2].copy_from_slice(b"he");
85    /// unsafe { buf.advance_mut(2) };
86    ///
87    /// // write more bytes
88    /// buf.chunk_mut()[0..3].copy_from_slice(b"llo");
89    ///
90    /// unsafe { buf.advance_mut(3); }
91    ///
92    /// assert_eq!(5, buf.len());
93    /// assert_eq!(buf, b"hello");
94    /// ```
95    ///
96    /// # Panics
97    ///
98    /// This function **may** panic if `cnt > self.remaining_mut()`.
99    ///
100    /// # Implementer notes
101    ///
102    /// It is recommended for implementations of `advance_mut` to panic if
103    /// `cnt > self.remaining_mut()`. If the implementation does not panic,
104    /// the call must behave as if `cnt == self.remaining_mut()`.
105    ///
106    /// A call with `cnt == 0` should never panic and be a no-op.
107    unsafe fn advance_mut(&mut self, cnt: usize);
108
109    /// Returns true if there is space in `self` for more bytes.
110    ///
111    /// This is equivalent to `self.remaining_mut() != 0`.
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// use bytes::BufMut;
117    ///
118    /// let mut dst = [0; 5];
119    /// let mut buf = &mut dst[..];
120    ///
121    /// assert!(buf.has_remaining_mut());
122    ///
123    /// buf.put(&b"hello"[..]);
124    ///
125    /// assert!(!buf.has_remaining_mut());
126    /// ```
127    #[inline]
128    fn has_remaining_mut(&self) -> bool {
129        self.remaining_mut() > 0
130    }
131
132    /// Returns a mutable slice starting at the current BufMut position and of
133    /// length between 0 and `BufMut::remaining_mut()`. Note that this *can* be shorter than the
134    /// whole remainder of the buffer (this allows non-continuous implementation).
135    ///
136    /// This is a lower level function. Most operations are done with other
137    /// functions.
138    ///
139    /// The returned byte slice may represent uninitialized memory.
140    ///
141    /// # Examples
142    ///
143    /// ```
144    /// use bytes::BufMut;
145    ///
146    /// let mut buf = Vec::with_capacity(16);
147    ///
148    /// unsafe {
149    ///     // MaybeUninit::as_mut_ptr
150    ///     buf.chunk_mut()[0..].as_mut_ptr().write(b'h');
151    ///     buf.chunk_mut()[1..].as_mut_ptr().write(b'e');
152    ///
153    ///     buf.advance_mut(2);
154    ///
155    ///     buf.chunk_mut()[0..].as_mut_ptr().write(b'l');
156    ///     buf.chunk_mut()[1..].as_mut_ptr().write(b'l');
157    ///     buf.chunk_mut()[2..].as_mut_ptr().write(b'o');
158    ///
159    ///     buf.advance_mut(3);
160    /// }
161    ///
162    /// assert_eq!(5, buf.len());
163    /// assert_eq!(buf, b"hello");
164    /// ```
165    ///
166    /// # Implementer notes
167    ///
168    /// This function should never panic. `chunk_mut()` should return an empty
169    /// slice **if and only if** `remaining_mut()` returns 0. In other words,
170    /// `chunk_mut()` returning an empty slice implies that `remaining_mut()` will
171    /// return 0 and `remaining_mut()` returning 0 implies that `chunk_mut()` will
172    /// return an empty slice.
173    ///
174    /// This function may trigger an out-of-memory abort if it tries to allocate
175    /// memory and fails to do so.
176    // The `chunk_mut` method was previously called `bytes_mut`. This alias makes the
177    // rename more easily discoverable.
178    #[cfg_attr(docsrs, doc(alias = "bytes_mut"))]
179    fn chunk_mut(&mut self) -> &mut UninitSlice;
180
181    /// Transfer bytes into `self` from `src` and advance the cursor by the
182    /// number of bytes written.
183    ///
184    /// # Examples
185    ///
186    /// ```
187    /// use bytes::BufMut;
188    ///
189    /// let mut buf = vec![];
190    ///
191    /// buf.put_u8(b'h');
192    /// buf.put(&b"ello"[..]);
193    /// buf.put(&b" world"[..]);
194    ///
195    /// assert_eq!(buf, b"hello world");
196    /// ```
197    ///
198    /// # Panics
199    ///
200    /// Panics if `self` does not have enough capacity to contain `src`.
201    #[inline]
202    fn put<T: super::Buf>(&mut self, mut src: T)
203    where
204        Self: Sized,
205    {
206        if self.remaining_mut() < src.remaining() {
207            panic_advance(src.remaining(), self.remaining_mut());
208        }
209
210        while src.has_remaining() {
211            let s = src.chunk();
212            let d = self.chunk_mut();
213            let cnt = usize::min(s.len(), d.len());
214
215            d[..cnt].copy_from_slice(&s[..cnt]);
216
217            // SAFETY: We just initialized `cnt` bytes in `self`.
218            unsafe { self.advance_mut(cnt) };
219            src.advance(cnt);
220        }
221    }
222
223    /// Transfer bytes into `self` from `src` and advance the cursor by the
224    /// number of bytes written.
225    ///
226    /// `self` must have enough remaining capacity to contain all of `src`.
227    ///
228    /// ```
229    /// use bytes::BufMut;
230    ///
231    /// let mut dst = [0; 6];
232    ///
233    /// {
234    ///     let mut buf = &mut dst[..];
235    ///     buf.put_slice(b"hello");
236    ///
237    ///     assert_eq!(1, buf.remaining_mut());
238    /// }
239    ///
240    /// assert_eq!(b"hello\0", &dst);
241    /// ```
242    #[inline]
243    fn put_slice(&mut self, mut src: &[u8]) {
244        if self.remaining_mut() < src.len() {
245            panic_advance(src.len(), self.remaining_mut());
246        }
247
248        while !src.is_empty() {
249            let dst = self.chunk_mut();
250            let cnt = usize::min(src.len(), dst.len());
251
252            dst[..cnt].copy_from_slice(&src[..cnt]);
253            src = &src[cnt..];
254
255            // SAFETY: We just initialized `cnt` bytes in `self`.
256            unsafe { self.advance_mut(cnt) };
257        }
258    }
259
260    /// Put `cnt` bytes `val` into `self`.
261    ///
262    /// Logically equivalent to calling `self.put_u8(val)` `cnt` times, but may work faster.
263    ///
264    /// `self` must have at least `cnt` remaining capacity.
265    ///
266    /// ```
267    /// use bytes::BufMut;
268    ///
269    /// let mut dst = [0; 6];
270    ///
271    /// {
272    ///     let mut buf = &mut dst[..];
273    ///     buf.put_bytes(b'a', 4);
274    ///
275    ///     assert_eq!(2, buf.remaining_mut());
276    /// }
277    ///
278    /// assert_eq!(b"aaaa\0\0", &dst);
279    /// ```
280    ///
281    /// # Panics
282    ///
283    /// This function panics if there is not enough remaining capacity in
284    /// `self`.
285    #[inline]
286    fn put_bytes(&mut self, val: u8, mut cnt: usize) {
287        if self.remaining_mut() < cnt {
288            panic_advance(cnt, self.remaining_mut());
289        }
290
291        while cnt > 0 {
292            let dst = self.chunk_mut();
293            let dst_len = usize::min(dst.len(), cnt);
294            // SAFETY: The pointer is valid for `dst_len <= dst.len()` bytes.
295            unsafe { core::ptr::write_bytes(dst.as_mut_ptr(), val, dst_len) };
296            // SAFETY: We just initialized `dst_len` bytes in `self`.
297            unsafe { self.advance_mut(dst_len) };
298            cnt -= dst_len;
299        }
300    }
301
302    /// Writes an unsigned 8 bit integer to `self`.
303    ///
304    /// The current position is advanced by 1.
305    ///
306    /// # Examples
307    ///
308    /// ```
309    /// use bytes::BufMut;
310    ///
311    /// let mut buf = vec![];
312    /// buf.put_u8(0x01);
313    /// assert_eq!(buf, b"\x01");
314    /// ```
315    ///
316    /// # Panics
317    ///
318    /// This function panics if there is not enough remaining capacity in
319    /// `self`.
320    #[inline]
321    fn put_u8(&mut self, n: u8) {
322        let src = [n];
323        self.put_slice(&src);
324    }
325
326    /// Writes a signed 8 bit integer to `self`.
327    ///
328    /// The current position is advanced by 1.
329    ///
330    /// # Examples
331    ///
332    /// ```
333    /// use bytes::BufMut;
334    ///
335    /// let mut buf = vec![];
336    /// buf.put_i8(0x01);
337    /// assert_eq!(buf, b"\x01");
338    /// ```
339    ///
340    /// # Panics
341    ///
342    /// This function panics if there is not enough remaining capacity in
343    /// `self`.
344    #[inline]
345    fn put_i8(&mut self, n: i8) {
346        let src = [n as u8];
347        self.put_slice(&src)
348    }
349
350    /// Writes an unsigned 16 bit integer to `self` in big-endian byte order.
351    ///
352    /// The current position is advanced by 2.
353    ///
354    /// # Examples
355    ///
356    /// ```
357    /// use bytes::BufMut;
358    ///
359    /// let mut buf = vec![];
360    /// buf.put_u16(0x0809);
361    /// assert_eq!(buf, b"\x08\x09");
362    /// ```
363    ///
364    /// # Panics
365    ///
366    /// This function panics if there is not enough remaining capacity in
367    /// `self`.
368    #[inline]
369    fn put_u16(&mut self, n: u16) {
370        self.put_slice(&n.to_be_bytes())
371    }
372
373    /// Writes an unsigned 16 bit integer to `self` in little-endian byte order.
374    ///
375    /// The current position is advanced by 2.
376    ///
377    /// # Examples
378    ///
379    /// ```
380    /// use bytes::BufMut;
381    ///
382    /// let mut buf = vec![];
383    /// buf.put_u16_le(0x0809);
384    /// assert_eq!(buf, b"\x09\x08");
385    /// ```
386    ///
387    /// # Panics
388    ///
389    /// This function panics if there is not enough remaining capacity in
390    /// `self`.
391    #[inline]
392    fn put_u16_le(&mut self, n: u16) {
393        self.put_slice(&n.to_le_bytes())
394    }
395
396    /// Writes an unsigned 16 bit integer to `self` in native-endian byte order.
397    ///
398    /// The current position is advanced by 2.
399    ///
400    /// # Examples
401    ///
402    /// ```
403    /// use bytes::BufMut;
404    ///
405    /// let mut buf = vec![];
406    /// buf.put_u16_ne(0x0809);
407    /// if cfg!(target_endian = "big") {
408    ///     assert_eq!(buf, b"\x08\x09");
409    /// } else {
410    ///     assert_eq!(buf, b"\x09\x08");
411    /// }
412    /// ```
413    ///
414    /// # Panics
415    ///
416    /// This function panics if there is not enough remaining capacity in
417    /// `self`.
418    #[inline]
419    fn put_u16_ne(&mut self, n: u16) {
420        self.put_slice(&n.to_ne_bytes())
421    }
422
423    /// Writes a signed 16 bit integer to `self` in big-endian byte order.
424    ///
425    /// The current position is advanced by 2.
426    ///
427    /// # Examples
428    ///
429    /// ```
430    /// use bytes::BufMut;
431    ///
432    /// let mut buf = vec![];
433    /// buf.put_i16(0x0809);
434    /// assert_eq!(buf, b"\x08\x09");
435    /// ```
436    ///
437    /// # Panics
438    ///
439    /// This function panics if there is not enough remaining capacity in
440    /// `self`.
441    #[inline]
442    fn put_i16(&mut self, n: i16) {
443        self.put_slice(&n.to_be_bytes())
444    }
445
446    /// Writes a signed 16 bit integer to `self` in little-endian byte order.
447    ///
448    /// The current position is advanced by 2.
449    ///
450    /// # Examples
451    ///
452    /// ```
453    /// use bytes::BufMut;
454    ///
455    /// let mut buf = vec![];
456    /// buf.put_i16_le(0x0809);
457    /// assert_eq!(buf, b"\x09\x08");
458    /// ```
459    ///
460    /// # Panics
461    ///
462    /// This function panics if there is not enough remaining capacity in
463    /// `self`.
464    #[inline]
465    fn put_i16_le(&mut self, n: i16) {
466        self.put_slice(&n.to_le_bytes())
467    }
468
469    /// Writes a signed 16 bit integer to `self` in native-endian byte order.
470    ///
471    /// The current position is advanced by 2.
472    ///
473    /// # Examples
474    ///
475    /// ```
476    /// use bytes::BufMut;
477    ///
478    /// let mut buf = vec![];
479    /// buf.put_i16_ne(0x0809);
480    /// if cfg!(target_endian = "big") {
481    ///     assert_eq!(buf, b"\x08\x09");
482    /// } else {
483    ///     assert_eq!(buf, b"\x09\x08");
484    /// }
485    /// ```
486    ///
487    /// # Panics
488    ///
489    /// This function panics if there is not enough remaining capacity in
490    /// `self`.
491    #[inline]
492    fn put_i16_ne(&mut self, n: i16) {
493        self.put_slice(&n.to_ne_bytes())
494    }
495
496    /// Writes an unsigned 32 bit integer to `self` in big-endian byte order.
497    ///
498    /// The current position is advanced by 4.
499    ///
500    /// # Examples
501    ///
502    /// ```
503    /// use bytes::BufMut;
504    ///
505    /// let mut buf = vec![];
506    /// buf.put_u32(0x0809A0A1);
507    /// assert_eq!(buf, b"\x08\x09\xA0\xA1");
508    /// ```
509    ///
510    /// # Panics
511    ///
512    /// This function panics if there is not enough remaining capacity in
513    /// `self`.
514    #[inline]
515    fn put_u32(&mut self, n: u32) {
516        self.put_slice(&n.to_be_bytes())
517    }
518
519    /// Writes an unsigned 32 bit integer to `self` in little-endian byte order.
520    ///
521    /// The current position is advanced by 4.
522    ///
523    /// # Examples
524    ///
525    /// ```
526    /// use bytes::BufMut;
527    ///
528    /// let mut buf = vec![];
529    /// buf.put_u32_le(0x0809A0A1);
530    /// assert_eq!(buf, b"\xA1\xA0\x09\x08");
531    /// ```
532    ///
533    /// # Panics
534    ///
535    /// This function panics if there is not enough remaining capacity in
536    /// `self`.
537    #[inline]
538    fn put_u32_le(&mut self, n: u32) {
539        self.put_slice(&n.to_le_bytes())
540    }
541
542    /// Writes an unsigned 32 bit integer to `self` in native-endian byte order.
543    ///
544    /// The current position is advanced by 4.
545    ///
546    /// # Examples
547    ///
548    /// ```
549    /// use bytes::BufMut;
550    ///
551    /// let mut buf = vec![];
552    /// buf.put_u32_ne(0x0809A0A1);
553    /// if cfg!(target_endian = "big") {
554    ///     assert_eq!(buf, b"\x08\x09\xA0\xA1");
555    /// } else {
556    ///     assert_eq!(buf, b"\xA1\xA0\x09\x08");
557    /// }
558    /// ```
559    ///
560    /// # Panics
561    ///
562    /// This function panics if there is not enough remaining capacity in
563    /// `self`.
564    #[inline]
565    fn put_u32_ne(&mut self, n: u32) {
566        self.put_slice(&n.to_ne_bytes())
567    }
568
569    /// Writes a signed 32 bit integer to `self` in big-endian byte order.
570    ///
571    /// The current position is advanced by 4.
572    ///
573    /// # Examples
574    ///
575    /// ```
576    /// use bytes::BufMut;
577    ///
578    /// let mut buf = vec![];
579    /// buf.put_i32(0x0809A0A1);
580    /// assert_eq!(buf, b"\x08\x09\xA0\xA1");
581    /// ```
582    ///
583    /// # Panics
584    ///
585    /// This function panics if there is not enough remaining capacity in
586    /// `self`.
587    #[inline]
588    fn put_i32(&mut self, n: i32) {
589        self.put_slice(&n.to_be_bytes())
590    }
591
592    /// Writes a signed 32 bit integer to `self` in little-endian byte order.
593    ///
594    /// The current position is advanced by 4.
595    ///
596    /// # Examples
597    ///
598    /// ```
599    /// use bytes::BufMut;
600    ///
601    /// let mut buf = vec![];
602    /// buf.put_i32_le(0x0809A0A1);
603    /// assert_eq!(buf, b"\xA1\xA0\x09\x08");
604    /// ```
605    ///
606    /// # Panics
607    ///
608    /// This function panics if there is not enough remaining capacity in
609    /// `self`.
610    #[inline]
611    fn put_i32_le(&mut self, n: i32) {
612        self.put_slice(&n.to_le_bytes())
613    }
614
615    /// Writes a signed 32 bit integer to `self` in native-endian byte order.
616    ///
617    /// The current position is advanced by 4.
618    ///
619    /// # Examples
620    ///
621    /// ```
622    /// use bytes::BufMut;
623    ///
624    /// let mut buf = vec![];
625    /// buf.put_i32_ne(0x0809A0A1);
626    /// if cfg!(target_endian = "big") {
627    ///     assert_eq!(buf, b"\x08\x09\xA0\xA1");
628    /// } else {
629    ///     assert_eq!(buf, b"\xA1\xA0\x09\x08");
630    /// }
631    /// ```
632    ///
633    /// # Panics
634    ///
635    /// This function panics if there is not enough remaining capacity in
636    /// `self`.
637    #[inline]
638    fn put_i32_ne(&mut self, n: i32) {
639        self.put_slice(&n.to_ne_bytes())
640    }
641
642    /// Writes an unsigned 64 bit integer to `self` in the big-endian byte order.
643    ///
644    /// The current position is advanced by 8.
645    ///
646    /// # Examples
647    ///
648    /// ```
649    /// use bytes::BufMut;
650    ///
651    /// let mut buf = vec![];
652    /// buf.put_u64(0x0102030405060708);
653    /// assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08");
654    /// ```
655    ///
656    /// # Panics
657    ///
658    /// This function panics if there is not enough remaining capacity in
659    /// `self`.
660    #[inline]
661    fn put_u64(&mut self, n: u64) {
662        self.put_slice(&n.to_be_bytes())
663    }
664
665    /// Writes an unsigned 64 bit integer to `self` in little-endian byte order.
666    ///
667    /// The current position is advanced by 8.
668    ///
669    /// # Examples
670    ///
671    /// ```
672    /// use bytes::BufMut;
673    ///
674    /// let mut buf = vec![];
675    /// buf.put_u64_le(0x0102030405060708);
676    /// assert_eq!(buf, b"\x08\x07\x06\x05\x04\x03\x02\x01");
677    /// ```
678    ///
679    /// # Panics
680    ///
681    /// This function panics if there is not enough remaining capacity in
682    /// `self`.
683    #[inline]
684    fn put_u64_le(&mut self, n: u64) {
685        self.put_slice(&n.to_le_bytes())
686    }
687
688    /// Writes an unsigned 64 bit integer to `self` in native-endian byte order.
689    ///
690    /// The current position is advanced by 8.
691    ///
692    /// # Examples
693    ///
694    /// ```
695    /// use bytes::BufMut;
696    ///
697    /// let mut buf = vec![];
698    /// buf.put_u64_ne(0x0102030405060708);
699    /// if cfg!(target_endian = "big") {
700    ///     assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08");
701    /// } else {
702    ///     assert_eq!(buf, b"\x08\x07\x06\x05\x04\x03\x02\x01");
703    /// }
704    /// ```
705    ///
706    /// # Panics
707    ///
708    /// This function panics if there is not enough remaining capacity in
709    /// `self`.
710    #[inline]
711    fn put_u64_ne(&mut self, n: u64) {
712        self.put_slice(&n.to_ne_bytes())
713    }
714
715    /// Writes a signed 64 bit integer to `self` in the big-endian byte order.
716    ///
717    /// The current position is advanced by 8.
718    ///
719    /// # Examples
720    ///
721    /// ```
722    /// use bytes::BufMut;
723    ///
724    /// let mut buf = vec![];
725    /// buf.put_i64(0x0102030405060708);
726    /// assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08");
727    /// ```
728    ///
729    /// # Panics
730    ///
731    /// This function panics if there is not enough remaining capacity in
732    /// `self`.
733    #[inline]
734    fn put_i64(&mut self, n: i64) {
735        self.put_slice(&n.to_be_bytes())
736    }
737
738    /// Writes a signed 64 bit integer to `self` in little-endian byte order.
739    ///
740    /// The current position is advanced by 8.
741    ///
742    /// # Examples
743    ///
744    /// ```
745    /// use bytes::BufMut;
746    ///
747    /// let mut buf = vec![];
748    /// buf.put_i64_le(0x0102030405060708);
749    /// assert_eq!(buf, b"\x08\x07\x06\x05\x04\x03\x02\x01");
750    /// ```
751    ///
752    /// # Panics
753    ///
754    /// This function panics if there is not enough remaining capacity in
755    /// `self`.
756    #[inline]
757    fn put_i64_le(&mut self, n: i64) {
758        self.put_slice(&n.to_le_bytes())
759    }
760
761    /// Writes a signed 64 bit integer to `self` in native-endian byte order.
762    ///
763    /// The current position is advanced by 8.
764    ///
765    /// # Examples
766    ///
767    /// ```
768    /// use bytes::BufMut;
769    ///
770    /// let mut buf = vec![];
771    /// buf.put_i64_ne(0x0102030405060708);
772    /// if cfg!(target_endian = "big") {
773    ///     assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08");
774    /// } else {
775    ///     assert_eq!(buf, b"\x08\x07\x06\x05\x04\x03\x02\x01");
776    /// }
777    /// ```
778    ///
779    /// # Panics
780    ///
781    /// This function panics if there is not enough remaining capacity in
782    /// `self`.
783    #[inline]
784    fn put_i64_ne(&mut self, n: i64) {
785        self.put_slice(&n.to_ne_bytes())
786    }
787
788    /// Writes an unsigned 128 bit integer to `self` in the big-endian byte order.
789    ///
790    /// The current position is advanced by 16.
791    ///
792    /// # Examples
793    ///
794    /// ```
795    /// use bytes::BufMut;
796    ///
797    /// let mut buf = vec![];
798    /// buf.put_u128(0x01020304050607080910111213141516);
799    /// assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16");
800    /// ```
801    ///
802    /// # Panics
803    ///
804    /// This function panics if there is not enough remaining capacity in
805    /// `self`.
806    #[inline]
807    fn put_u128(&mut self, n: u128) {
808        self.put_slice(&n.to_be_bytes())
809    }
810
811    /// Writes an unsigned 128 bit integer to `self` in little-endian byte order.
812    ///
813    /// The current position is advanced by 16.
814    ///
815    /// # Examples
816    ///
817    /// ```
818    /// use bytes::BufMut;
819    ///
820    /// let mut buf = vec![];
821    /// buf.put_u128_le(0x01020304050607080910111213141516);
822    /// assert_eq!(buf, b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01");
823    /// ```
824    ///
825    /// # Panics
826    ///
827    /// This function panics if there is not enough remaining capacity in
828    /// `self`.
829    #[inline]
830    fn put_u128_le(&mut self, n: u128) {
831        self.put_slice(&n.to_le_bytes())
832    }
833
834    /// Writes an unsigned 128 bit integer to `self` in native-endian byte order.
835    ///
836    /// The current position is advanced by 16.
837    ///
838    /// # Examples
839    ///
840    /// ```
841    /// use bytes::BufMut;
842    ///
843    /// let mut buf = vec![];
844    /// buf.put_u128_ne(0x01020304050607080910111213141516);
845    /// if cfg!(target_endian = "big") {
846    ///     assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16");
847    /// } else {
848    ///     assert_eq!(buf, b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01");
849    /// }
850    /// ```
851    ///
852    /// # Panics
853    ///
854    /// This function panics if there is not enough remaining capacity in
855    /// `self`.
856    #[inline]
857    fn put_u128_ne(&mut self, n: u128) {
858        self.put_slice(&n.to_ne_bytes())
859    }
860
861    /// Writes a signed 128 bit integer to `self` in the big-endian byte order.
862    ///
863    /// The current position is advanced by 16.
864    ///
865    /// # Examples
866    ///
867    /// ```
868    /// use bytes::BufMut;
869    ///
870    /// let mut buf = vec![];
871    /// buf.put_i128(0x01020304050607080910111213141516);
872    /// assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16");
873    /// ```
874    ///
875    /// # Panics
876    ///
877    /// This function panics if there is not enough remaining capacity in
878    /// `self`.
879    #[inline]
880    fn put_i128(&mut self, n: i128) {
881        self.put_slice(&n.to_be_bytes())
882    }
883
884    /// Writes a signed 128 bit integer to `self` in little-endian byte order.
885    ///
886    /// The current position is advanced by 16.
887    ///
888    /// # Examples
889    ///
890    /// ```
891    /// use bytes::BufMut;
892    ///
893    /// let mut buf = vec![];
894    /// buf.put_i128_le(0x01020304050607080910111213141516);
895    /// assert_eq!(buf, b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01");
896    /// ```
897    ///
898    /// # Panics
899    ///
900    /// This function panics if there is not enough remaining capacity in
901    /// `self`.
902    #[inline]
903    fn put_i128_le(&mut self, n: i128) {
904        self.put_slice(&n.to_le_bytes())
905    }
906
907    /// Writes a signed 128 bit integer to `self` in native-endian byte order.
908    ///
909    /// The current position is advanced by 16.
910    ///
911    /// # Examples
912    ///
913    /// ```
914    /// use bytes::BufMut;
915    ///
916    /// let mut buf = vec![];
917    /// buf.put_i128_ne(0x01020304050607080910111213141516);
918    /// if cfg!(target_endian = "big") {
919    ///     assert_eq!(buf, b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16");
920    /// } else {
921    ///     assert_eq!(buf, b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01");
922    /// }
923    /// ```
924    ///
925    /// # Panics
926    ///
927    /// This function panics if there is not enough remaining capacity in
928    /// `self`.
929    #[inline]
930    fn put_i128_ne(&mut self, n: i128) {
931        self.put_slice(&n.to_ne_bytes())
932    }
933
934    /// Writes an unsigned n-byte integer to `self` in big-endian byte order.
935    ///
936    /// The current position is advanced by `nbytes`.
937    ///
938    /// # Examples
939    ///
940    /// ```
941    /// use bytes::BufMut;
942    ///
943    /// let mut buf = vec![];
944    /// buf.put_uint(0x010203, 3);
945    /// assert_eq!(buf, b"\x01\x02\x03");
946    /// ```
947    ///
948    /// # Panics
949    ///
950    /// This function panics if there is not enough remaining capacity in
951    /// `self` or if `nbytes` is greater than 8.
952    #[inline]
953    fn put_uint(&mut self, n: u64, nbytes: usize) {
954        let start = match mem::size_of_val(&n).checked_sub(nbytes) {
955            Some(start) => start,
956            None => panic_does_not_fit(nbytes, mem::size_of_val(&n)),
957        };
958
959        self.put_slice(&n.to_be_bytes()[start..]);
960    }
961
962    /// Writes an unsigned n-byte integer to `self` in the little-endian byte order.
963    ///
964    /// The current position is advanced by `nbytes`.
965    ///
966    /// # Examples
967    ///
968    /// ```
969    /// use bytes::BufMut;
970    ///
971    /// let mut buf = vec![];
972    /// buf.put_uint_le(0x010203, 3);
973    /// assert_eq!(buf, b"\x03\x02\x01");
974    /// ```
975    ///
976    /// # Panics
977    ///
978    /// This function panics if there is not enough remaining capacity in
979    /// `self` or if `nbytes` is greater than 8.
980    #[inline]
981    fn put_uint_le(&mut self, n: u64, nbytes: usize) {
982        let slice = n.to_le_bytes();
983        let slice = match slice.get(..nbytes) {
984            Some(slice) => slice,
985            None => panic_does_not_fit(nbytes, slice.len()),
986        };
987
988        self.put_slice(slice);
989    }
990
991    /// Writes an unsigned n-byte integer to `self` in the native-endian byte order.
992    ///
993    /// The current position is advanced by `nbytes`.
994    ///
995    /// # Examples
996    ///
997    /// ```
998    /// use bytes::BufMut;
999    ///
1000    /// let mut buf = vec![];
1001    /// buf.put_uint_ne(0x010203, 3);
1002    /// if cfg!(target_endian = "big") {
1003    ///     assert_eq!(buf, b"\x01\x02\x03");
1004    /// } else {
1005    ///     assert_eq!(buf, b"\x03\x02\x01");
1006    /// }
1007    /// ```
1008    ///
1009    /// # Panics
1010    ///
1011    /// This function panics if there is not enough remaining capacity in
1012    /// `self` or if `nbytes` is greater than 8.
1013    #[inline]
1014    fn put_uint_ne(&mut self, n: u64, nbytes: usize) {
1015        if cfg!(target_endian = "big") {
1016            self.put_uint(n, nbytes)
1017        } else {
1018            self.put_uint_le(n, nbytes)
1019        }
1020    }
1021
1022    /// Writes low `nbytes` of a signed integer to `self` in big-endian byte order.
1023    ///
1024    /// The current position is advanced by `nbytes`.
1025    ///
1026    /// # Examples
1027    ///
1028    /// ```
1029    /// use bytes::BufMut;
1030    ///
1031    /// let mut buf = vec![];
1032    /// buf.put_int(0x0504010203, 3);
1033    /// assert_eq!(buf, b"\x01\x02\x03");
1034    /// ```
1035    ///
1036    /// # Panics
1037    ///
1038    /// This function panics if there is not enough remaining capacity in
1039    /// `self` or if `nbytes` is greater than 8.
1040    #[inline]
1041    fn put_int(&mut self, n: i64, nbytes: usize) {
1042        let start = match mem::size_of_val(&n).checked_sub(nbytes) {
1043            Some(start) => start,
1044            None => panic_does_not_fit(nbytes, mem::size_of_val(&n)),
1045        };
1046
1047        self.put_slice(&n.to_be_bytes()[start..]);
1048    }
1049
1050    /// Writes low `nbytes` of a signed integer to `self` in little-endian byte order.
1051    ///
1052    /// The current position is advanced by `nbytes`.
1053    ///
1054    /// # Examples
1055    ///
1056    /// ```
1057    /// use bytes::BufMut;
1058    ///
1059    /// let mut buf = vec![];
1060    /// buf.put_int_le(0x0504010203, 3);
1061    /// assert_eq!(buf, b"\x03\x02\x01");
1062    /// ```
1063    ///
1064    /// # Panics
1065    ///
1066    /// This function panics if there is not enough remaining capacity in
1067    /// `self` or if `nbytes` is greater than 8.
1068    #[inline]
1069    fn put_int_le(&mut self, n: i64, nbytes: usize) {
1070        let slice = n.to_le_bytes();
1071        let slice = match slice.get(..nbytes) {
1072            Some(slice) => slice,
1073            None => panic_does_not_fit(nbytes, slice.len()),
1074        };
1075
1076        self.put_slice(slice);
1077    }
1078
1079    /// Writes low `nbytes` of a signed integer to `self` in native-endian byte order.
1080    ///
1081    /// The current position is advanced by `nbytes`.
1082    ///
1083    /// # Examples
1084    ///
1085    /// ```
1086    /// use bytes::BufMut;
1087    ///
1088    /// let mut buf = vec![];
1089    /// buf.put_int_ne(0x010203, 3);
1090    /// if cfg!(target_endian = "big") {
1091    ///     assert_eq!(buf, b"\x01\x02\x03");
1092    /// } else {
1093    ///     assert_eq!(buf, b"\x03\x02\x01");
1094    /// }
1095    /// ```
1096    ///
1097    /// # Panics
1098    ///
1099    /// This function panics if there is not enough remaining capacity in
1100    /// `self` or if `nbytes` is greater than 8.
1101    #[inline]
1102    fn put_int_ne(&mut self, n: i64, nbytes: usize) {
1103        if cfg!(target_endian = "big") {
1104            self.put_int(n, nbytes)
1105        } else {
1106            self.put_int_le(n, nbytes)
1107        }
1108    }
1109
1110    /// Writes an IEEE754 single-precision (4 bytes) floating point number to
1111    /// `self` in big-endian byte order.
1112    ///
1113    /// The current position is advanced by 4.
1114    ///
1115    /// # Examples
1116    ///
1117    /// ```
1118    /// use bytes::BufMut;
1119    ///
1120    /// let mut buf = vec![];
1121    /// buf.put_f32(1.2f32);
1122    /// assert_eq!(buf, b"\x3F\x99\x99\x9A");
1123    /// ```
1124    ///
1125    /// # Panics
1126    ///
1127    /// This function panics if there is not enough remaining capacity in
1128    /// `self`.
1129    #[inline]
1130    fn put_f32(&mut self, n: f32) {
1131        self.put_u32(n.to_bits());
1132    }
1133
1134    /// Writes an IEEE754 single-precision (4 bytes) floating point number to
1135    /// `self` in little-endian byte order.
1136    ///
1137    /// The current position is advanced by 4.
1138    ///
1139    /// # Examples
1140    ///
1141    /// ```
1142    /// use bytes::BufMut;
1143    ///
1144    /// let mut buf = vec![];
1145    /// buf.put_f32_le(1.2f32);
1146    /// assert_eq!(buf, b"\x9A\x99\x99\x3F");
1147    /// ```
1148    ///
1149    /// # Panics
1150    ///
1151    /// This function panics if there is not enough remaining capacity in
1152    /// `self`.
1153    #[inline]
1154    fn put_f32_le(&mut self, n: f32) {
1155        self.put_u32_le(n.to_bits());
1156    }
1157
1158    /// Writes an IEEE754 single-precision (4 bytes) floating point number to
1159    /// `self` in native-endian byte order.
1160    ///
1161    /// The current position is advanced by 4.
1162    ///
1163    /// # Examples
1164    ///
1165    /// ```
1166    /// use bytes::BufMut;
1167    ///
1168    /// let mut buf = vec![];
1169    /// buf.put_f32_ne(1.2f32);
1170    /// if cfg!(target_endian = "big") {
1171    ///     assert_eq!(buf, b"\x3F\x99\x99\x9A");
1172    /// } else {
1173    ///     assert_eq!(buf, b"\x9A\x99\x99\x3F");
1174    /// }
1175    /// ```
1176    ///
1177    /// # Panics
1178    ///
1179    /// This function panics if there is not enough remaining capacity in
1180    /// `self`.
1181    #[inline]
1182    fn put_f32_ne(&mut self, n: f32) {
1183        self.put_u32_ne(n.to_bits());
1184    }
1185
1186    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
1187    /// `self` in big-endian byte order.
1188    ///
1189    /// The current position is advanced by 8.
1190    ///
1191    /// # Examples
1192    ///
1193    /// ```
1194    /// use bytes::BufMut;
1195    ///
1196    /// let mut buf = vec![];
1197    /// buf.put_f64(1.2f64);
1198    /// assert_eq!(buf, b"\x3F\xF3\x33\x33\x33\x33\x33\x33");
1199    /// ```
1200    ///
1201    /// # Panics
1202    ///
1203    /// This function panics if there is not enough remaining capacity in
1204    /// `self`.
1205    #[inline]
1206    fn put_f64(&mut self, n: f64) {
1207        self.put_u64(n.to_bits());
1208    }
1209
1210    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
1211    /// `self` in little-endian byte order.
1212    ///
1213    /// The current position is advanced by 8.
1214    ///
1215    /// # Examples
1216    ///
1217    /// ```
1218    /// use bytes::BufMut;
1219    ///
1220    /// let mut buf = vec![];
1221    /// buf.put_f64_le(1.2f64);
1222    /// assert_eq!(buf, b"\x33\x33\x33\x33\x33\x33\xF3\x3F");
1223    /// ```
1224    ///
1225    /// # Panics
1226    ///
1227    /// This function panics if there is not enough remaining capacity in
1228    /// `self`.
1229    #[inline]
1230    fn put_f64_le(&mut self, n: f64) {
1231        self.put_u64_le(n.to_bits());
1232    }
1233
1234    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
1235    /// `self` in native-endian byte order.
1236    ///
1237    /// The current position is advanced by 8.
1238    ///
1239    /// # Examples
1240    ///
1241    /// ```
1242    /// use bytes::BufMut;
1243    ///
1244    /// let mut buf = vec![];
1245    /// buf.put_f64_ne(1.2f64);
1246    /// if cfg!(target_endian = "big") {
1247    ///     assert_eq!(buf, b"\x3F\xF3\x33\x33\x33\x33\x33\x33");
1248    /// } else {
1249    ///     assert_eq!(buf, b"\x33\x33\x33\x33\x33\x33\xF3\x3F");
1250    /// }
1251    /// ```
1252    ///
1253    /// # Panics
1254    ///
1255    /// This function panics if there is not enough remaining capacity in
1256    /// `self`.
1257    #[inline]
1258    fn put_f64_ne(&mut self, n: f64) {
1259        self.put_u64_ne(n.to_bits());
1260    }
1261
1262    /// Creates an adaptor which can write at most `limit` bytes to `self`.
1263    ///
1264    /// # Examples
1265    ///
1266    /// ```
1267    /// use bytes::BufMut;
1268    ///
1269    /// let arr = &mut [0u8; 128][..];
1270    /// assert_eq!(arr.remaining_mut(), 128);
1271    ///
1272    /// let dst = arr.limit(10);
1273    /// assert_eq!(dst.remaining_mut(), 10);
1274    /// ```
1275    #[inline]
1276    fn limit(self, limit: usize) -> Limit<Self>
1277    where
1278        Self: Sized,
1279    {
1280        limit::new(self, limit)
1281    }
1282
1283    /// Creates an adaptor which implements the `Write` trait for `self`.
1284    ///
1285    /// This function returns a new value which implements `Write` by adapting
1286    /// the `Write` trait functions to the `BufMut` trait functions. Given that
1287    /// `BufMut` operations are infallible, none of the `Write` functions will
1288    /// return with `Err`.
1289    ///
1290    /// # Examples
1291    ///
1292    /// ```
1293    /// use bytes::BufMut;
1294    /// use std::io::Write;
1295    ///
1296    /// let mut buf = vec![].writer();
1297    ///
1298    /// let num = buf.write(&b"hello world"[..]).unwrap();
1299    /// assert_eq!(11, num);
1300    ///
1301    /// let buf = buf.into_inner();
1302    ///
1303    /// assert_eq!(*buf, b"hello world"[..]);
1304    /// ```
1305    #[cfg(feature = "std")]
1306    #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
1307    #[inline]
1308    fn writer(self) -> Writer<Self>
1309    where
1310        Self: Sized,
1311    {
1312        writer::new(self)
1313    }
1314
1315    /// Creates an adapter which will chain this buffer with another.
1316    ///
1317    /// The returned `BufMut` instance will first write to all bytes from
1318    /// `self`. Afterwards, it will write to `next`.
1319    ///
1320    /// # Examples
1321    ///
1322    /// ```
1323    /// use bytes::BufMut;
1324    ///
1325    /// let mut a = [0u8; 5];
1326    /// let mut b = [0u8; 6];
1327    ///
1328    /// let mut chain = (&mut a[..]).chain_mut(&mut b[..]);
1329    ///
1330    /// chain.put_slice(b"hello world");
1331    ///
1332    /// assert_eq!(&a[..], b"hello");
1333    /// assert_eq!(&b[..], b" world");
1334    /// ```
1335    #[inline]
1336    fn chain_mut<U: BufMut>(self, next: U) -> Chain<Self, U>
1337    where
1338        Self: Sized,
1339    {
1340        Chain::new(self, next)
1341    }
1342}
1343
1344macro_rules! deref_forward_bufmut {
1345    () => {
1346        #[inline]
1347        fn remaining_mut(&self) -> usize {
1348            (**self).remaining_mut()
1349        }
1350
1351        #[inline]
1352        fn chunk_mut(&mut self) -> &mut UninitSlice {
1353            (**self).chunk_mut()
1354        }
1355
1356        #[inline]
1357        unsafe fn advance_mut(&mut self, cnt: usize) {
1358            (**self).advance_mut(cnt)
1359        }
1360
1361        #[inline]
1362        fn put_slice(&mut self, src: &[u8]) {
1363            (**self).put_slice(src)
1364        }
1365
1366        #[inline]
1367        fn put_u8(&mut self, n: u8) {
1368            (**self).put_u8(n)
1369        }
1370
1371        #[inline]
1372        fn put_i8(&mut self, n: i8) {
1373            (**self).put_i8(n)
1374        }
1375
1376        #[inline]
1377        fn put_u16(&mut self, n: u16) {
1378            (**self).put_u16(n)
1379        }
1380
1381        #[inline]
1382        fn put_u16_le(&mut self, n: u16) {
1383            (**self).put_u16_le(n)
1384        }
1385
1386        #[inline]
1387        fn put_u16_ne(&mut self, n: u16) {
1388            (**self).put_u16_ne(n)
1389        }
1390
1391        #[inline]
1392        fn put_i16(&mut self, n: i16) {
1393            (**self).put_i16(n)
1394        }
1395
1396        #[inline]
1397        fn put_i16_le(&mut self, n: i16) {
1398            (**self).put_i16_le(n)
1399        }
1400
1401        #[inline]
1402        fn put_i16_ne(&mut self, n: i16) {
1403            (**self).put_i16_ne(n)
1404        }
1405
1406        #[inline]
1407        fn put_u32(&mut self, n: u32) {
1408            (**self).put_u32(n)
1409        }
1410
1411        #[inline]
1412        fn put_u32_le(&mut self, n: u32) {
1413            (**self).put_u32_le(n)
1414        }
1415
1416        #[inline]
1417        fn put_u32_ne(&mut self, n: u32) {
1418            (**self).put_u32_ne(n)
1419        }
1420
1421        #[inline]
1422        fn put_i32(&mut self, n: i32) {
1423            (**self).put_i32(n)
1424        }
1425
1426        #[inline]
1427        fn put_i32_le(&mut self, n: i32) {
1428            (**self).put_i32_le(n)
1429        }
1430
1431        #[inline]
1432        fn put_i32_ne(&mut self, n: i32) {
1433            (**self).put_i32_ne(n)
1434        }
1435
1436        #[inline]
1437        fn put_u64(&mut self, n: u64) {
1438            (**self).put_u64(n)
1439        }
1440
1441        #[inline]
1442        fn put_u64_le(&mut self, n: u64) {
1443            (**self).put_u64_le(n)
1444        }
1445
1446        #[inline]
1447        fn put_u64_ne(&mut self, n: u64) {
1448            (**self).put_u64_ne(n)
1449        }
1450
1451        #[inline]
1452        fn put_i64(&mut self, n: i64) {
1453            (**self).put_i64(n)
1454        }
1455
1456        #[inline]
1457        fn put_i64_le(&mut self, n: i64) {
1458            (**self).put_i64_le(n)
1459        }
1460
1461        #[inline]
1462        fn put_i64_ne(&mut self, n: i64) {
1463            (**self).put_i64_ne(n)
1464        }
1465    };
1466}
1467
1468unsafe impl<T: BufMut + ?Sized> BufMut for &mut T {
1469    deref_forward_bufmut!();
1470}
1471
1472unsafe impl<T: BufMut + ?Sized> BufMut for Box<T> {
1473    deref_forward_bufmut!();
1474}
1475
1476unsafe impl BufMut for &mut [u8] {
1477    #[inline]
1478    fn remaining_mut(&self) -> usize {
1479        self.len()
1480    }
1481
1482    #[inline]
1483    fn chunk_mut(&mut self) -> &mut UninitSlice {
1484        UninitSlice::new(self)
1485    }
1486
1487    #[inline]
1488    unsafe fn advance_mut(&mut self, cnt: usize) {
1489        if self.len() < cnt {
1490            panic_advance(cnt, self.len());
1491        }
1492
1493        // Lifetime dance taken from `impl Write for &mut [u8]`.
1494        let (_, b) = core::mem::replace(self, &mut []).split_at_mut(cnt);
1495        *self = b;
1496    }
1497
1498    #[inline]
1499    fn put_slice(&mut self, src: &[u8]) {
1500        if self.len() < src.len() {
1501            panic_advance(src.len(), self.len());
1502        }
1503
1504        self[..src.len()].copy_from_slice(src);
1505        // SAFETY: We just initialized `src.len()` bytes.
1506        unsafe { self.advance_mut(src.len()) };
1507    }
1508
1509    #[inline]
1510    fn put_bytes(&mut self, val: u8, cnt: usize) {
1511        if self.len() < cnt {
1512            panic_advance(cnt, self.len());
1513        }
1514
1515        // SAFETY: We just checked that the pointer is valid for `cnt` bytes.
1516        unsafe {
1517            ptr::write_bytes(self.as_mut_ptr(), val, cnt);
1518            self.advance_mut(cnt);
1519        }
1520    }
1521}
1522
1523unsafe impl BufMut for &mut [core::mem::MaybeUninit<u8>] {
1524    #[inline]
1525    fn remaining_mut(&self) -> usize {
1526        self.len()
1527    }
1528
1529    #[inline]
1530    fn chunk_mut(&mut self) -> &mut UninitSlice {
1531        UninitSlice::uninit(self)
1532    }
1533
1534    #[inline]
1535    unsafe fn advance_mut(&mut self, cnt: usize) {
1536        if self.len() < cnt {
1537            panic_advance(cnt, self.len());
1538        }
1539
1540        // Lifetime dance taken from `impl Write for &mut [u8]`.
1541        let (_, b) = core::mem::replace(self, &mut []).split_at_mut(cnt);
1542        *self = b;
1543    }
1544
1545    #[inline]
1546    fn put_slice(&mut self, src: &[u8]) {
1547        if self.len() < src.len() {
1548            panic_advance(src.len(), self.len());
1549        }
1550
1551        // SAFETY: We just checked that the pointer is valid for `src.len()` bytes.
1552        unsafe {
1553            ptr::copy_nonoverlapping(src.as_ptr(), self.as_mut_ptr().cast(), src.len());
1554            self.advance_mut(src.len());
1555        }
1556    }
1557
1558    #[inline]
1559    fn put_bytes(&mut self, val: u8, cnt: usize) {
1560        if self.len() < cnt {
1561            panic_advance(cnt, self.len());
1562        }
1563
1564        // SAFETY: We just checked that the pointer is valid for `cnt` bytes.
1565        unsafe {
1566            ptr::write_bytes(self.as_mut_ptr() as *mut u8, val, cnt);
1567            self.advance_mut(cnt);
1568        }
1569    }
1570}
1571
1572unsafe impl BufMut for Vec<u8> {
1573    #[inline]
1574    fn remaining_mut(&self) -> usize {
1575        // A vector can never have more than isize::MAX bytes
1576        core::isize::MAX as usize - self.len()
1577    }
1578
1579    #[inline]
1580    unsafe fn advance_mut(&mut self, cnt: usize) {
1581        let len = self.len();
1582        let remaining = self.capacity() - len;
1583
1584        if remaining < cnt {
1585            panic_advance(cnt, remaining);
1586        }
1587
1588        // Addition will not overflow since the sum is at most the capacity.
1589        self.set_len(len + cnt);
1590    }
1591
1592    #[inline]
1593    fn chunk_mut(&mut self) -> &mut UninitSlice {
1594        if self.capacity() == self.len() {
1595            self.reserve(64); // Grow the vec
1596        }
1597
1598        let cap = self.capacity();
1599        let len = self.len();
1600
1601        let ptr = self.as_mut_ptr();
1602        // SAFETY: Since `ptr` is valid for `cap` bytes, `ptr.add(len)` must be
1603        // valid for `cap - len` bytes. The subtraction will not underflow since
1604        // `len <= cap`.
1605        unsafe { UninitSlice::from_raw_parts_mut(ptr.add(len), cap - len) }
1606    }
1607
1608    // Specialize these methods so they can skip checking `remaining_mut`
1609    // and `advance_mut`.
1610    #[inline]
1611    fn put<T: super::Buf>(&mut self, mut src: T)
1612    where
1613        Self: Sized,
1614    {
1615        // In case the src isn't contiguous, reserve upfront.
1616        self.reserve(src.remaining());
1617
1618        while src.has_remaining() {
1619            let s = src.chunk();
1620            let l = s.len();
1621            self.extend_from_slice(s);
1622            src.advance(l);
1623        }
1624    }
1625
1626    #[inline]
1627    fn put_slice(&mut self, src: &[u8]) {
1628        self.extend_from_slice(src);
1629    }
1630
1631    #[inline]
1632    fn put_bytes(&mut self, val: u8, cnt: usize) {
1633        // If the addition overflows, then the `resize` will fail.
1634        let new_len = self.len().saturating_add(cnt);
1635        self.resize(new_len, val);
1636    }
1637}
1638
1639// The existence of this function makes the compiler catch if the BufMut
1640// trait is "object-safe" or not.
1641fn _assert_trait_object(_b: &dyn BufMut) {}