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