bytes/buf/
buf_impl.rs

1#[cfg(feature = "std")]
2use crate::buf::{reader, Reader};
3use crate::buf::{take, Chain, Take};
4#[cfg(feature = "std")]
5use crate::{min_u64_usize, saturating_sub_usize_u64};
6use crate::{panic_advance, panic_does_not_fit, TryGetError};
7
8#[cfg(feature = "std")]
9use std::io::IoSlice;
10
11use alloc::boxed::Box;
12
13macro_rules! buf_try_get_impl {
14    ($this:ident, $typ:tt::$conv:tt) => {{
15        const SIZE: usize = core::mem::size_of::<$typ>();
16
17        if $this.remaining() < SIZE {
18            return Err(TryGetError {
19                requested: SIZE,
20                available: $this.remaining(),
21            });
22        }
23
24        // try to convert directly from the bytes
25        // this Option<ret> trick is to avoid keeping a borrow on self
26        // when advance() is called (mut borrow) and to call bytes() only once
27        let ret = $this
28            .chunk()
29            .get(..SIZE)
30            .map(|src| unsafe { $typ::$conv(*(src as *const _ as *const [_; SIZE])) });
31
32        if let Some(ret) = ret {
33            // if the direct conversion was possible, advance and return
34            $this.advance(SIZE);
35            return Ok(ret);
36        } else {
37            // if not we copy the bytes in a temp buffer then convert
38            let mut buf = [0; SIZE];
39            $this.copy_to_slice(&mut buf); // (do the advance)
40            return Ok($typ::$conv(buf));
41        }
42    }};
43    (le => $this:ident, $typ:tt, $len_to_read:expr) => {{
44        const SIZE: usize = core::mem::size_of::<$typ>();
45
46        // The same trick as above does not improve the best case speed.
47        // It seems to be linked to the way the method is optimised by the compiler
48        let mut buf = [0; SIZE];
49
50        let subslice = match buf.get_mut(..$len_to_read) {
51            Some(subslice) => subslice,
52            None => panic_does_not_fit(SIZE, $len_to_read),
53        };
54
55        $this.try_copy_to_slice(subslice)?;
56        return Ok($typ::from_le_bytes(buf));
57    }};
58    (be => $this:ident, $typ:tt, $len_to_read:expr) => {{
59        const SIZE: usize = core::mem::size_of::<$typ>();
60
61        let slice_at = match SIZE.checked_sub($len_to_read) {
62            Some(slice_at) => slice_at,
63            None => panic_does_not_fit(SIZE, $len_to_read),
64        };
65
66        let mut buf = [0; SIZE];
67        $this.try_copy_to_slice(&mut buf[slice_at..])?;
68        return Ok($typ::from_be_bytes(buf));
69    }};
70}
71
72macro_rules! buf_get_impl {
73    ($this:ident, $typ:tt::$conv:tt) => {{
74        return (|| buf_try_get_impl!($this, $typ::$conv))()
75            .unwrap_or_else(|error| panic_advance(&error));
76    }};
77    (le => $this:ident, $typ:tt, $len_to_read:expr) => {{
78        return (|| buf_try_get_impl!(le => $this, $typ, $len_to_read))()
79            .unwrap_or_else(|error| panic_advance(&error));
80    }};
81    (be => $this:ident, $typ:tt, $len_to_read:expr) => {{
82        return (|| buf_try_get_impl!(be => $this, $typ, $len_to_read))()
83            .unwrap_or_else(|error| panic_advance(&error));
84    }};
85}
86
87// https://en.wikipedia.org/wiki/Sign_extension
88fn sign_extend(val: u64, nbytes: usize) -> i64 {
89    let shift = (8 - nbytes) * 8;
90    (val << shift) as i64 >> shift
91}
92
93/// Read bytes from a buffer.
94///
95/// A buffer stores bytes in memory such that read operations are infallible.
96/// The underlying storage may or may not be in contiguous memory. A `Buf` value
97/// is a cursor into the buffer. Reading from `Buf` advances the cursor
98/// position. It can be thought of as an efficient `Iterator` for collections of
99/// bytes.
100///
101/// The simplest `Buf` is a `&[u8]`.
102///
103/// ```
104/// use bytes::Buf;
105///
106/// let mut buf = &b"hello world"[..];
107///
108/// assert_eq!(b'h', buf.get_u8());
109/// assert_eq!(b'e', buf.get_u8());
110/// assert_eq!(b'l', buf.get_u8());
111///
112/// let mut rest = [0; 8];
113/// buf.copy_to_slice(&mut rest);
114///
115/// assert_eq!(&rest[..], &b"lo world"[..]);
116/// ```
117pub trait Buf {
118    /// Returns the number of bytes between the current position and the end of
119    /// the buffer.
120    ///
121    /// This value is greater than or equal to the length of the slice returned
122    /// by `chunk()`.
123    ///
124    /// # Examples
125    ///
126    /// ```
127    /// use bytes::Buf;
128    ///
129    /// let mut buf = &b"hello world"[..];
130    ///
131    /// assert_eq!(buf.remaining(), 11);
132    ///
133    /// buf.get_u8();
134    ///
135    /// assert_eq!(buf.remaining(), 10);
136    /// ```
137    ///
138    /// # Implementer notes
139    ///
140    /// Implementations of `remaining` should ensure that the return value does
141    /// not change unless a call is made to `advance` or any other function that
142    /// is documented to change the `Buf`'s current position.
143    fn remaining(&self) -> usize;
144
145    /// Returns a slice starting at the current position and of length between 0
146    /// and `Buf::remaining()`. Note that this *can* return a shorter slice (this
147    /// allows non-continuous internal representation).
148    ///
149    /// This is a lower level function. Most operations are done with other
150    /// functions.
151    ///
152    /// # Examples
153    ///
154    /// ```
155    /// use bytes::Buf;
156    ///
157    /// let mut buf = &b"hello world"[..];
158    ///
159    /// assert_eq!(buf.chunk(), &b"hello world"[..]);
160    ///
161    /// buf.advance(6);
162    ///
163    /// assert_eq!(buf.chunk(), &b"world"[..]);
164    /// ```
165    ///
166    /// # Implementer notes
167    ///
168    /// This function should never panic. `chunk()` should return an empty
169    /// slice **if and only if** `remaining()` returns 0. In other words,
170    /// `chunk()` returning an empty slice implies that `remaining()` will
171    /// return 0 and `remaining()` returning 0 implies that `chunk()` will
172    /// return an empty slice.
173    // The `chunk` method was previously called `bytes`. This alias makes the rename
174    // more easily discoverable.
175    #[cfg_attr(docsrs, doc(alias = "bytes"))]
176    fn chunk(&self) -> &[u8];
177
178    /// Fills `dst` with potentially multiple slices starting at `self`'s
179    /// current position.
180    ///
181    /// If the `Buf` is backed by disjoint slices of bytes, `chunk_vectored` enables
182    /// fetching more than one slice at once. `dst` is a slice of `IoSlice`
183    /// references, enabling the slice to be directly used with [`writev`]
184    /// without any further conversion. The sum of the lengths of all the
185    /// buffers written to `dst` will be less than or equal to `Buf::remaining()`.
186    ///
187    /// The entries in `dst` will be overwritten, but the data **contained** by
188    /// the slices **will not** be modified. The return value is the number of
189    /// slices written to `dst`. If `Buf::remaining()` is non-zero, then this
190    /// writes at least one non-empty slice to `dst`.
191    ///
192    /// This is a lower level function. Most operations are done with other
193    /// functions.
194    ///
195    /// # Implementer notes
196    ///
197    /// This function should never panic. Once the end of the buffer is reached,
198    /// i.e., `Buf::remaining` returns 0, calls to `chunk_vectored` must return 0
199    /// without mutating `dst`.
200    ///
201    /// Implementations should also take care to properly handle being called
202    /// with `dst` being a zero length slice.
203    ///
204    /// [`writev`]: http://man7.org/linux/man-pages/man2/readv.2.html
205    #[cfg(feature = "std")]
206    #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
207    fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
208        if dst.is_empty() {
209            return 0;
210        }
211
212        if self.has_remaining() {
213            dst[0] = IoSlice::new(self.chunk());
214            1
215        } else {
216            0
217        }
218    }
219
220    /// Advance the internal cursor of the Buf
221    ///
222    /// The next call to `chunk()` will return a slice starting `cnt` bytes
223    /// further into the underlying buffer.
224    ///
225    /// # Examples
226    ///
227    /// ```
228    /// use bytes::Buf;
229    ///
230    /// let mut buf = &b"hello world"[..];
231    ///
232    /// assert_eq!(buf.chunk(), &b"hello world"[..]);
233    ///
234    /// buf.advance(6);
235    ///
236    /// assert_eq!(buf.chunk(), &b"world"[..]);
237    /// ```
238    ///
239    /// # Panics
240    ///
241    /// This function **may** panic if `cnt > self.remaining()`.
242    ///
243    /// # Implementer notes
244    ///
245    /// It is recommended for implementations of `advance` to panic if `cnt >
246    /// self.remaining()`. If the implementation does not panic, the call must
247    /// behave as if `cnt == self.remaining()`.
248    ///
249    /// A call with `cnt == 0` should never panic and be a no-op.
250    fn advance(&mut self, cnt: usize);
251
252    /// Returns true if there are any more bytes to consume
253    ///
254    /// This is equivalent to `self.remaining() != 0`.
255    ///
256    /// # Examples
257    ///
258    /// ```
259    /// use bytes::Buf;
260    ///
261    /// let mut buf = &b"a"[..];
262    ///
263    /// assert!(buf.has_remaining());
264    ///
265    /// buf.get_u8();
266    ///
267    /// assert!(!buf.has_remaining());
268    /// ```
269    fn has_remaining(&self) -> bool {
270        self.remaining() > 0
271    }
272
273    /// Copies bytes from `self` into `dst`.
274    ///
275    /// The cursor is advanced by the number of bytes copied. `self` must have
276    /// enough remaining bytes to fill `dst`.
277    ///
278    /// # Examples
279    ///
280    /// ```
281    /// use bytes::Buf;
282    ///
283    /// let mut buf = &b"hello world"[..];
284    /// let mut dst = [0; 5];
285    ///
286    /// buf.copy_to_slice(&mut dst);
287    /// assert_eq!(&b"hello"[..], &dst);
288    /// assert_eq!(6, buf.remaining());
289    /// ```
290    ///
291    /// # Panics
292    ///
293    /// This function panics if `self.remaining() < dst.len()`.
294    fn copy_to_slice(&mut self, dst: &mut [u8]) {
295        self.try_copy_to_slice(dst)
296            .unwrap_or_else(|error| panic_advance(&error));
297    }
298
299    /// Gets an unsigned 8 bit integer from `self`.
300    ///
301    /// The current position is advanced by 1.
302    ///
303    /// # Examples
304    ///
305    /// ```
306    /// use bytes::Buf;
307    ///
308    /// let mut buf = &b"\x08 hello"[..];
309    /// assert_eq!(8, buf.get_u8());
310    /// ```
311    ///
312    /// # Panics
313    ///
314    /// This function panics if there is no more remaining data in `self`.
315    fn get_u8(&mut self) -> u8 {
316        if self.remaining() < 1 {
317            panic_advance(&TryGetError {
318                requested: 1,
319                available: 0,
320            })
321        }
322        let ret = self.chunk()[0];
323        self.advance(1);
324        ret
325    }
326
327    /// Gets a signed 8 bit integer from `self`.
328    ///
329    /// The current position is advanced by 1.
330    ///
331    /// # Examples
332    ///
333    /// ```
334    /// use bytes::Buf;
335    ///
336    /// let mut buf = &b"\x08 hello"[..];
337    /// assert_eq!(8, buf.get_i8());
338    /// ```
339    ///
340    /// # Panics
341    ///
342    /// This function panics if there is no more remaining data in `self`.
343    fn get_i8(&mut self) -> i8 {
344        if self.remaining() < 1 {
345            panic_advance(&TryGetError {
346                requested: 1,
347                available: 0,
348            });
349        }
350        let ret = self.chunk()[0] as i8;
351        self.advance(1);
352        ret
353    }
354
355    /// Gets an unsigned 16 bit integer from `self` in big-endian byte order.
356    ///
357    /// The current position is advanced by 2.
358    ///
359    /// # Examples
360    ///
361    /// ```
362    /// use bytes::Buf;
363    ///
364    /// let mut buf = &b"\x08\x09 hello"[..];
365    /// assert_eq!(0x0809, buf.get_u16());
366    /// ```
367    ///
368    /// # Panics
369    ///
370    /// This function panics if there is not enough remaining data in `self`.
371    fn get_u16(&mut self) -> u16 {
372        buf_get_impl!(self, u16::from_be_bytes);
373    }
374
375    /// Gets an unsigned 16 bit integer from `self` in little-endian byte order.
376    ///
377    /// The current position is advanced by 2.
378    ///
379    /// # Examples
380    ///
381    /// ```
382    /// use bytes::Buf;
383    ///
384    /// let mut buf = &b"\x09\x08 hello"[..];
385    /// assert_eq!(0x0809, buf.get_u16_le());
386    /// ```
387    ///
388    /// # Panics
389    ///
390    /// This function panics if there is not enough remaining data in `self`.
391    fn get_u16_le(&mut self) -> u16 {
392        buf_get_impl!(self, u16::from_le_bytes);
393    }
394
395    /// Gets an unsigned 16 bit integer from `self` in native-endian byte order.
396    ///
397    /// The current position is advanced by 2.
398    ///
399    /// # Examples
400    ///
401    /// ```
402    /// use bytes::Buf;
403    ///
404    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
405    ///     true => b"\x08\x09 hello",
406    ///     false => b"\x09\x08 hello",
407    /// };
408    /// assert_eq!(0x0809, buf.get_u16_ne());
409    /// ```
410    ///
411    /// # Panics
412    ///
413    /// This function panics if there is not enough remaining data in `self`.
414    fn get_u16_ne(&mut self) -> u16 {
415        buf_get_impl!(self, u16::from_ne_bytes);
416    }
417
418    /// Gets a signed 16 bit integer from `self` in big-endian byte order.
419    ///
420    /// The current position is advanced by 2.
421    ///
422    /// # Examples
423    ///
424    /// ```
425    /// use bytes::Buf;
426    ///
427    /// let mut buf = &b"\x08\x09 hello"[..];
428    /// assert_eq!(0x0809, buf.get_i16());
429    /// ```
430    ///
431    /// # Panics
432    ///
433    /// This function panics if there is not enough remaining data in `self`.
434    fn get_i16(&mut self) -> i16 {
435        buf_get_impl!(self, i16::from_be_bytes);
436    }
437
438    /// Gets a signed 16 bit integer from `self` in little-endian byte order.
439    ///
440    /// The current position is advanced by 2.
441    ///
442    /// # Examples
443    ///
444    /// ```
445    /// use bytes::Buf;
446    ///
447    /// let mut buf = &b"\x09\x08 hello"[..];
448    /// assert_eq!(0x0809, buf.get_i16_le());
449    /// ```
450    ///
451    /// # Panics
452    ///
453    /// This function panics if there is not enough remaining data in `self`.
454    fn get_i16_le(&mut self) -> i16 {
455        buf_get_impl!(self, i16::from_le_bytes);
456    }
457
458    /// Gets a signed 16 bit integer from `self` in native-endian byte order.
459    ///
460    /// The current position is advanced by 2.
461    ///
462    /// # Examples
463    ///
464    /// ```
465    /// use bytes::Buf;
466    ///
467    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
468    ///     true => b"\x08\x09 hello",
469    ///     false => b"\x09\x08 hello",
470    /// };
471    /// assert_eq!(0x0809, buf.get_i16_ne());
472    /// ```
473    ///
474    /// # Panics
475    ///
476    /// This function panics if there is not enough remaining data in `self`.
477    fn get_i16_ne(&mut self) -> i16 {
478        buf_get_impl!(self, i16::from_ne_bytes);
479    }
480
481    /// Gets an unsigned 32 bit integer from `self` in the big-endian byte order.
482    ///
483    /// The current position is advanced by 4.
484    ///
485    /// # Examples
486    ///
487    /// ```
488    /// use bytes::Buf;
489    ///
490    /// let mut buf = &b"\x08\x09\xA0\xA1 hello"[..];
491    /// assert_eq!(0x0809A0A1, buf.get_u32());
492    /// ```
493    ///
494    /// # Panics
495    ///
496    /// This function panics if there is not enough remaining data in `self`.
497    fn get_u32(&mut self) -> u32 {
498        buf_get_impl!(self, u32::from_be_bytes);
499    }
500
501    /// Gets an unsigned 32 bit integer from `self` in the little-endian byte order.
502    ///
503    /// The current position is advanced by 4.
504    ///
505    /// # Examples
506    ///
507    /// ```
508    /// use bytes::Buf;
509    ///
510    /// let mut buf = &b"\xA1\xA0\x09\x08 hello"[..];
511    /// assert_eq!(0x0809A0A1, buf.get_u32_le());
512    /// ```
513    ///
514    /// # Panics
515    ///
516    /// This function panics if there is not enough remaining data in `self`.
517    fn get_u32_le(&mut self) -> u32 {
518        buf_get_impl!(self, u32::from_le_bytes);
519    }
520
521    /// Gets an unsigned 32 bit integer from `self` in native-endian byte order.
522    ///
523    /// The current position is advanced by 4.
524    ///
525    /// # Examples
526    ///
527    /// ```
528    /// use bytes::Buf;
529    ///
530    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
531    ///     true => b"\x08\x09\xA0\xA1 hello",
532    ///     false => b"\xA1\xA0\x09\x08 hello",
533    /// };
534    /// assert_eq!(0x0809A0A1, buf.get_u32_ne());
535    /// ```
536    ///
537    /// # Panics
538    ///
539    /// This function panics if there is not enough remaining data in `self`.
540    fn get_u32_ne(&mut self) -> u32 {
541        buf_get_impl!(self, u32::from_ne_bytes);
542    }
543
544    /// Gets a signed 32 bit integer from `self` in big-endian byte order.
545    ///
546    /// The current position is advanced by 4.
547    ///
548    /// # Examples
549    ///
550    /// ```
551    /// use bytes::Buf;
552    ///
553    /// let mut buf = &b"\x08\x09\xA0\xA1 hello"[..];
554    /// assert_eq!(0x0809A0A1, buf.get_i32());
555    /// ```
556    ///
557    /// # Panics
558    ///
559    /// This function panics if there is not enough remaining data in `self`.
560    fn get_i32(&mut self) -> i32 {
561        buf_get_impl!(self, i32::from_be_bytes);
562    }
563
564    /// Gets a signed 32 bit integer from `self` in little-endian byte order.
565    ///
566    /// The current position is advanced by 4.
567    ///
568    /// # Examples
569    ///
570    /// ```
571    /// use bytes::Buf;
572    ///
573    /// let mut buf = &b"\xA1\xA0\x09\x08 hello"[..];
574    /// assert_eq!(0x0809A0A1, buf.get_i32_le());
575    /// ```
576    ///
577    /// # Panics
578    ///
579    /// This function panics if there is not enough remaining data in `self`.
580    fn get_i32_le(&mut self) -> i32 {
581        buf_get_impl!(self, i32::from_le_bytes);
582    }
583
584    /// Gets a signed 32 bit integer from `self` in native-endian byte order.
585    ///
586    /// The current position is advanced by 4.
587    ///
588    /// # Examples
589    ///
590    /// ```
591    /// use bytes::Buf;
592    ///
593    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
594    ///     true => b"\x08\x09\xA0\xA1 hello",
595    ///     false => b"\xA1\xA0\x09\x08 hello",
596    /// };
597    /// assert_eq!(0x0809A0A1, buf.get_i32_ne());
598    /// ```
599    ///
600    /// # Panics
601    ///
602    /// This function panics if there is not enough remaining data in `self`.
603    fn get_i32_ne(&mut self) -> i32 {
604        buf_get_impl!(self, i32::from_ne_bytes);
605    }
606
607    /// Gets an unsigned 64 bit integer from `self` in big-endian byte order.
608    ///
609    /// The current position is advanced by 8.
610    ///
611    /// # Examples
612    ///
613    /// ```
614    /// use bytes::Buf;
615    ///
616    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08 hello"[..];
617    /// assert_eq!(0x0102030405060708, buf.get_u64());
618    /// ```
619    ///
620    /// # Panics
621    ///
622    /// This function panics if there is not enough remaining data in `self`.
623    fn get_u64(&mut self) -> u64 {
624        buf_get_impl!(self, u64::from_be_bytes);
625    }
626
627    /// Gets an unsigned 64 bit integer from `self` in little-endian byte order.
628    ///
629    /// The current position is advanced by 8.
630    ///
631    /// # Examples
632    ///
633    /// ```
634    /// use bytes::Buf;
635    ///
636    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
637    /// assert_eq!(0x0102030405060708, buf.get_u64_le());
638    /// ```
639    ///
640    /// # Panics
641    ///
642    /// This function panics if there is not enough remaining data in `self`.
643    fn get_u64_le(&mut self) -> u64 {
644        buf_get_impl!(self, u64::from_le_bytes);
645    }
646
647    /// Gets an unsigned 64 bit integer from `self` in native-endian byte order.
648    ///
649    /// The current position is advanced by 8.
650    ///
651    /// # Examples
652    ///
653    /// ```
654    /// use bytes::Buf;
655    ///
656    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
657    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08 hello",
658    ///     false => b"\x08\x07\x06\x05\x04\x03\x02\x01 hello",
659    /// };
660    /// assert_eq!(0x0102030405060708, buf.get_u64_ne());
661    /// ```
662    ///
663    /// # Panics
664    ///
665    /// This function panics if there is not enough remaining data in `self`.
666    fn get_u64_ne(&mut self) -> u64 {
667        buf_get_impl!(self, u64::from_ne_bytes);
668    }
669
670    /// Gets a signed 64 bit integer from `self` in big-endian byte order.
671    ///
672    /// The current position is advanced by 8.
673    ///
674    /// # Examples
675    ///
676    /// ```
677    /// use bytes::Buf;
678    ///
679    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08 hello"[..];
680    /// assert_eq!(0x0102030405060708, buf.get_i64());
681    /// ```
682    ///
683    /// # Panics
684    ///
685    /// This function panics if there is not enough remaining data in `self`.
686    fn get_i64(&mut self) -> i64 {
687        buf_get_impl!(self, i64::from_be_bytes);
688    }
689
690    /// Gets a signed 64 bit integer from `self` in little-endian byte order.
691    ///
692    /// The current position is advanced by 8.
693    ///
694    /// # Examples
695    ///
696    /// ```
697    /// use bytes::Buf;
698    ///
699    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
700    /// assert_eq!(0x0102030405060708, buf.get_i64_le());
701    /// ```
702    ///
703    /// # Panics
704    ///
705    /// This function panics if there is not enough remaining data in `self`.
706    fn get_i64_le(&mut self) -> i64 {
707        buf_get_impl!(self, i64::from_le_bytes);
708    }
709
710    /// Gets a signed 64 bit integer from `self` in native-endian byte order.
711    ///
712    /// The current position is advanced by 8.
713    ///
714    /// # Examples
715    ///
716    /// ```
717    /// use bytes::Buf;
718    ///
719    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
720    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08 hello",
721    ///     false => b"\x08\x07\x06\x05\x04\x03\x02\x01 hello",
722    /// };
723    /// assert_eq!(0x0102030405060708, buf.get_i64_ne());
724    /// ```
725    ///
726    /// # Panics
727    ///
728    /// This function panics if there is not enough remaining data in `self`.
729    fn get_i64_ne(&mut self) -> i64 {
730        buf_get_impl!(self, i64::from_ne_bytes);
731    }
732
733    /// Gets an unsigned 128 bit integer from `self` in big-endian byte order.
734    ///
735    /// The current position is advanced by 16.
736    ///
737    /// # Examples
738    ///
739    /// ```
740    /// use bytes::Buf;
741    ///
742    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello"[..];
743    /// assert_eq!(0x01020304050607080910111213141516, buf.get_u128());
744    /// ```
745    ///
746    /// # Panics
747    ///
748    /// This function panics if there is not enough remaining data in `self`.
749    fn get_u128(&mut self) -> u128 {
750        buf_get_impl!(self, u128::from_be_bytes);
751    }
752
753    /// Gets an unsigned 128 bit integer from `self` in little-endian byte order.
754    ///
755    /// The current position is advanced by 16.
756    ///
757    /// # Examples
758    ///
759    /// ```
760    /// use bytes::Buf;
761    ///
762    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
763    /// assert_eq!(0x01020304050607080910111213141516, buf.get_u128_le());
764    /// ```
765    ///
766    /// # Panics
767    ///
768    /// This function panics if there is not enough remaining data in `self`.
769    fn get_u128_le(&mut self) -> u128 {
770        buf_get_impl!(self, u128::from_le_bytes);
771    }
772
773    /// Gets an unsigned 128 bit integer from `self` in native-endian byte order.
774    ///
775    /// The current position is advanced by 16.
776    ///
777    /// # Examples
778    ///
779    /// ```
780    /// use bytes::Buf;
781    ///
782    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
783    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello",
784    ///     false => b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello",
785    /// };
786    /// assert_eq!(0x01020304050607080910111213141516, buf.get_u128_ne());
787    /// ```
788    ///
789    /// # Panics
790    ///
791    /// This function panics if there is not enough remaining data in `self`.
792    fn get_u128_ne(&mut self) -> u128 {
793        buf_get_impl!(self, u128::from_ne_bytes);
794    }
795
796    /// Gets a signed 128 bit integer from `self` in big-endian byte order.
797    ///
798    /// The current position is advanced by 16.
799    ///
800    /// # Examples
801    ///
802    /// ```
803    /// use bytes::Buf;
804    ///
805    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello"[..];
806    /// assert_eq!(0x01020304050607080910111213141516, buf.get_i128());
807    /// ```
808    ///
809    /// # Panics
810    ///
811    /// This function panics if there is not enough remaining data in `self`.
812    fn get_i128(&mut self) -> i128 {
813        buf_get_impl!(self, i128::from_be_bytes);
814    }
815
816    /// Gets a signed 128 bit integer from `self` in little-endian byte order.
817    ///
818    /// The current position is advanced by 16.
819    ///
820    /// # Examples
821    ///
822    /// ```
823    /// use bytes::Buf;
824    ///
825    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
826    /// assert_eq!(0x01020304050607080910111213141516, buf.get_i128_le());
827    /// ```
828    ///
829    /// # Panics
830    ///
831    /// This function panics if there is not enough remaining data in `self`.
832    fn get_i128_le(&mut self) -> i128 {
833        buf_get_impl!(self, i128::from_le_bytes);
834    }
835
836    /// Gets a signed 128 bit integer from `self` in native-endian byte order.
837    ///
838    /// The current position is advanced by 16.
839    ///
840    /// # Examples
841    ///
842    /// ```
843    /// use bytes::Buf;
844    ///
845    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
846    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello",
847    ///     false => b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello",
848    /// };
849    /// assert_eq!(0x01020304050607080910111213141516, buf.get_i128_ne());
850    /// ```
851    ///
852    /// # Panics
853    ///
854    /// This function panics if there is not enough remaining data in `self`.
855    fn get_i128_ne(&mut self) -> i128 {
856        buf_get_impl!(self, i128::from_ne_bytes);
857    }
858
859    /// Gets an unsigned n-byte integer from `self` in big-endian byte order.
860    ///
861    /// The current position is advanced by `nbytes`.
862    ///
863    /// # Examples
864    ///
865    /// ```
866    /// use bytes::Buf;
867    ///
868    /// let mut buf = &b"\x01\x02\x03 hello"[..];
869    /// assert_eq!(0x010203, buf.get_uint(3));
870    /// ```
871    ///
872    /// # Panics
873    ///
874    /// This function panics if there is not enough remaining data in `self`, or
875    /// if `nbytes` is greater than 8.
876    fn get_uint(&mut self, nbytes: usize) -> u64 {
877        buf_get_impl!(be => self, u64, nbytes);
878    }
879
880    /// Gets an unsigned n-byte integer from `self` in little-endian byte order.
881    ///
882    /// The current position is advanced by `nbytes`.
883    ///
884    /// # Examples
885    ///
886    /// ```
887    /// use bytes::Buf;
888    ///
889    /// let mut buf = &b"\x03\x02\x01 hello"[..];
890    /// assert_eq!(0x010203, buf.get_uint_le(3));
891    /// ```
892    ///
893    /// # Panics
894    ///
895    /// This function panics if there is not enough remaining data in `self`, or
896    /// if `nbytes` is greater than 8.
897    fn get_uint_le(&mut self, nbytes: usize) -> u64 {
898        buf_get_impl!(le => self, u64, nbytes);
899    }
900
901    /// Gets an unsigned n-byte integer from `self` in native-endian byte order.
902    ///
903    /// The current position is advanced by `nbytes`.
904    ///
905    /// # Examples
906    ///
907    /// ```
908    /// use bytes::Buf;
909    ///
910    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
911    ///     true => b"\x01\x02\x03 hello",
912    ///     false => b"\x03\x02\x01 hello",
913    /// };
914    /// assert_eq!(0x010203, buf.get_uint_ne(3));
915    /// ```
916    ///
917    /// # Panics
918    ///
919    /// This function panics if there is not enough remaining data in `self`, or
920    /// if `nbytes` is greater than 8.
921    fn get_uint_ne(&mut self, nbytes: usize) -> u64 {
922        if cfg!(target_endian = "big") {
923            self.get_uint(nbytes)
924        } else {
925            self.get_uint_le(nbytes)
926        }
927    }
928
929    /// Gets a signed n-byte integer from `self` in big-endian byte order.
930    ///
931    /// The current position is advanced by `nbytes`.
932    ///
933    /// # Examples
934    ///
935    /// ```
936    /// use bytes::Buf;
937    ///
938    /// let mut buf = &b"\x01\x02\x03 hello"[..];
939    /// assert_eq!(0x010203, buf.get_int(3));
940    /// ```
941    ///
942    /// # Panics
943    ///
944    /// This function panics if there is not enough remaining data in `self`, or
945    /// if `nbytes` is greater than 8.
946    fn get_int(&mut self, nbytes: usize) -> i64 {
947        sign_extend(self.get_uint(nbytes), nbytes)
948    }
949
950    /// Gets a signed n-byte integer from `self` in little-endian byte order.
951    ///
952    /// The current position is advanced by `nbytes`.
953    ///
954    /// # Examples
955    ///
956    /// ```
957    /// use bytes::Buf;
958    ///
959    /// let mut buf = &b"\x03\x02\x01 hello"[..];
960    /// assert_eq!(0x010203, buf.get_int_le(3));
961    /// ```
962    ///
963    /// # Panics
964    ///
965    /// This function panics if there is not enough remaining data in `self`, or
966    /// if `nbytes` is greater than 8.
967    fn get_int_le(&mut self, nbytes: usize) -> i64 {
968        sign_extend(self.get_uint_le(nbytes), nbytes)
969    }
970
971    /// Gets a signed n-byte integer from `self` in native-endian byte order.
972    ///
973    /// The current position is advanced by `nbytes`.
974    ///
975    /// # Examples
976    ///
977    /// ```
978    /// use bytes::Buf;
979    ///
980    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
981    ///     true => b"\x01\x02\x03 hello",
982    ///     false => b"\x03\x02\x01 hello",
983    /// };
984    /// assert_eq!(0x010203, buf.get_int_ne(3));
985    /// ```
986    ///
987    /// # Panics
988    ///
989    /// This function panics if there is not enough remaining data in `self`, or
990    /// if `nbytes` is greater than 8.
991    fn get_int_ne(&mut self, nbytes: usize) -> i64 {
992        if cfg!(target_endian = "big") {
993            self.get_int(nbytes)
994        } else {
995            self.get_int_le(nbytes)
996        }
997    }
998
999    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
1000    /// `self` in big-endian byte order.
1001    ///
1002    /// The current position is advanced by 4.
1003    ///
1004    /// # Examples
1005    ///
1006    /// ```
1007    /// use bytes::Buf;
1008    ///
1009    /// let mut buf = &b"\x3F\x99\x99\x9A hello"[..];
1010    /// assert_eq!(1.2f32, buf.get_f32());
1011    /// ```
1012    ///
1013    /// # Panics
1014    ///
1015    /// This function panics if there is not enough remaining data in `self`.
1016    fn get_f32(&mut self) -> f32 {
1017        f32::from_bits(self.get_u32())
1018    }
1019
1020    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
1021    /// `self` in little-endian byte order.
1022    ///
1023    /// The current position is advanced by 4.
1024    ///
1025    /// # Examples
1026    ///
1027    /// ```
1028    /// use bytes::Buf;
1029    ///
1030    /// let mut buf = &b"\x9A\x99\x99\x3F hello"[..];
1031    /// assert_eq!(1.2f32, buf.get_f32_le());
1032    /// ```
1033    ///
1034    /// # Panics
1035    ///
1036    /// This function panics if there is not enough remaining data in `self`.
1037    fn get_f32_le(&mut self) -> f32 {
1038        f32::from_bits(self.get_u32_le())
1039    }
1040
1041    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
1042    /// `self` in native-endian byte order.
1043    ///
1044    /// The current position is advanced by 4.
1045    ///
1046    /// # Examples
1047    ///
1048    /// ```
1049    /// use bytes::Buf;
1050    ///
1051    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1052    ///     true => b"\x3F\x99\x99\x9A hello",
1053    ///     false => b"\x9A\x99\x99\x3F hello",
1054    /// };
1055    /// assert_eq!(1.2f32, buf.get_f32_ne());
1056    /// ```
1057    ///
1058    /// # Panics
1059    ///
1060    /// This function panics if there is not enough remaining data in `self`.
1061    fn get_f32_ne(&mut self) -> f32 {
1062        f32::from_bits(self.get_u32_ne())
1063    }
1064
1065    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
1066    /// `self` in big-endian byte order.
1067    ///
1068    /// The current position is advanced by 8.
1069    ///
1070    /// # Examples
1071    ///
1072    /// ```
1073    /// use bytes::Buf;
1074    ///
1075    /// let mut buf = &b"\x3F\xF3\x33\x33\x33\x33\x33\x33 hello"[..];
1076    /// assert_eq!(1.2f64, buf.get_f64());
1077    /// ```
1078    ///
1079    /// # Panics
1080    ///
1081    /// This function panics if there is not enough remaining data in `self`.
1082    fn get_f64(&mut self) -> f64 {
1083        f64::from_bits(self.get_u64())
1084    }
1085
1086    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
1087    /// `self` in little-endian byte order.
1088    ///
1089    /// The current position is advanced by 8.
1090    ///
1091    /// # Examples
1092    ///
1093    /// ```
1094    /// use bytes::Buf;
1095    ///
1096    /// let mut buf = &b"\x33\x33\x33\x33\x33\x33\xF3\x3F hello"[..];
1097    /// assert_eq!(1.2f64, buf.get_f64_le());
1098    /// ```
1099    ///
1100    /// # Panics
1101    ///
1102    /// This function panics if there is not enough remaining data in `self`.
1103    fn get_f64_le(&mut self) -> f64 {
1104        f64::from_bits(self.get_u64_le())
1105    }
1106
1107    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
1108    /// `self` in native-endian byte order.
1109    ///
1110    /// The current position is advanced by 8.
1111    ///
1112    /// # Examples
1113    ///
1114    /// ```
1115    /// use bytes::Buf;
1116    ///
1117    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1118    ///     true => b"\x3F\xF3\x33\x33\x33\x33\x33\x33 hello",
1119    ///     false => b"\x33\x33\x33\x33\x33\x33\xF3\x3F hello",
1120    /// };
1121    /// assert_eq!(1.2f64, buf.get_f64_ne());
1122    /// ```
1123    ///
1124    /// # Panics
1125    ///
1126    /// This function panics if there is not enough remaining data in `self`.
1127    fn get_f64_ne(&mut self) -> f64 {
1128        f64::from_bits(self.get_u64_ne())
1129    }
1130
1131    /// Copies bytes from `self` into `dst`.
1132    ///
1133    /// The cursor is advanced by the number of bytes copied. `self` must have
1134    /// enough remaining bytes to fill `dst`.
1135    ///
1136    /// Returns `Err(TryGetError)` when there are not enough
1137    /// remaining bytes to read the value.
1138    ///
1139    /// # Examples
1140    ///
1141    /// ```
1142    /// use bytes::Buf;
1143    ///
1144    /// let mut buf = &b"hello world"[..];
1145    /// let mut dst = [0; 5];
1146    ///
1147    /// assert_eq!(Ok(()), buf.try_copy_to_slice(&mut dst));
1148    /// assert_eq!(&b"hello"[..], &dst);
1149    /// assert_eq!(6, buf.remaining());
1150    /// ```
1151    ///
1152    /// ```
1153    /// use bytes::{Buf, TryGetError};
1154    ///
1155    /// let mut buf = &b"hello world"[..];
1156    /// let mut dst = [0; 12];
1157    ///
1158    /// assert_eq!(Err(TryGetError{requested: 12, available: 11}), buf.try_copy_to_slice(&mut dst));
1159    /// assert_eq!(11, buf.remaining());
1160    /// ```
1161    fn try_copy_to_slice(&mut self, mut dst: &mut [u8]) -> Result<(), TryGetError> {
1162        if self.remaining() < dst.len() {
1163            return Err(TryGetError {
1164                requested: dst.len(),
1165                available: self.remaining(),
1166            });
1167        }
1168
1169        while !dst.is_empty() {
1170            let src = self.chunk();
1171            let cnt = usize::min(src.len(), dst.len());
1172
1173            dst[..cnt].copy_from_slice(&src[..cnt]);
1174            dst = &mut dst[cnt..];
1175
1176            self.advance(cnt);
1177        }
1178        Ok(())
1179    }
1180
1181    /// Gets an unsigned 8 bit integer from `self`.
1182    ///
1183    /// The current position is advanced by 1.
1184    ///
1185    /// Returns `Err(TryGetError)` when there are not enough
1186    /// remaining bytes to read the value.
1187    ///
1188    /// # Examples
1189    ///
1190    /// ```
1191    /// use bytes::Buf;
1192    ///
1193    /// let mut buf = &b"\x08 hello"[..];
1194    /// assert_eq!(Ok(0x08_u8), buf.try_get_u8());
1195    /// assert_eq!(6, buf.remaining());
1196    /// ```
1197    ///
1198    /// ```
1199    /// use bytes::{Buf, TryGetError};
1200    ///
1201    /// let mut buf = &b""[..];
1202    /// assert_eq!(Err(TryGetError{requested: 1, available: 0}), buf.try_get_u8());
1203    /// ```
1204    fn try_get_u8(&mut self) -> Result<u8, TryGetError> {
1205        if self.remaining() < 1 {
1206            return Err(TryGetError {
1207                requested: 1,
1208                available: self.remaining(),
1209            });
1210        }
1211        let ret = self.chunk()[0];
1212        self.advance(1);
1213        Ok(ret)
1214    }
1215
1216    /// Gets a signed 8 bit integer from `self`.
1217    ///
1218    /// The current position is advanced by 1.
1219    ///
1220    /// Returns `Err(TryGetError)` when there are not enough
1221    /// remaining bytes to read the value.
1222    ///
1223    /// # Examples
1224    ///
1225    /// ```
1226    /// use bytes::Buf;
1227    ///
1228    /// let mut buf = &b"\x08 hello"[..];
1229    /// assert_eq!(Ok(0x08_i8), buf.try_get_i8());
1230    /// assert_eq!(6, buf.remaining());
1231    /// ```
1232    ///
1233    /// ```
1234    /// use bytes::{Buf, TryGetError};
1235    ///
1236    /// let mut buf = &b""[..];
1237    /// assert_eq!(Err(TryGetError{requested: 1, available: 0}), buf.try_get_i8());
1238    /// ```
1239    fn try_get_i8(&mut self) -> Result<i8, TryGetError> {
1240        if self.remaining() < 1 {
1241            return Err(TryGetError {
1242                requested: 1,
1243                available: self.remaining(),
1244            });
1245        }
1246        let ret = self.chunk()[0] as i8;
1247        self.advance(1);
1248        Ok(ret)
1249    }
1250
1251    /// Gets an unsigned 16 bit integer from `self` in big-endian byte order.
1252    ///
1253    /// The current position is advanced by 2.
1254    ///
1255    /// Returns `Err(TryGetError)` when there are not enough
1256    /// remaining bytes to read the value.
1257    ///
1258    /// # Examples
1259    ///
1260    /// ```
1261    /// use bytes::Buf;
1262    ///
1263    /// let mut buf = &b"\x08\x09 hello"[..];
1264    /// assert_eq!(Ok(0x0809_u16), buf.try_get_u16());
1265    /// assert_eq!(6, buf.remaining());
1266    /// ```
1267    ///
1268    /// ```
1269    /// use bytes::{Buf, TryGetError};
1270    ///
1271    /// let mut buf = &b"\x08"[..];
1272    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_u16());
1273    /// assert_eq!(1, buf.remaining());
1274    /// ```
1275    fn try_get_u16(&mut self) -> Result<u16, TryGetError> {
1276        buf_try_get_impl!(self, u16::from_be_bytes)
1277    }
1278
1279    /// Gets an unsigned 16 bit integer from `self` in little-endian byte order.
1280    ///
1281    /// The current position is advanced by 2.
1282    ///
1283    /// Returns `Err(TryGetError)` when there are not enough
1284    /// remaining bytes to read the value.
1285    ///
1286    /// # Examples
1287    ///
1288    /// ```
1289    /// use bytes::Buf;
1290    ///
1291    /// let mut buf = &b"\x09\x08 hello"[..];
1292    /// assert_eq!(Ok(0x0809_u16), buf.try_get_u16_le());
1293    /// assert_eq!(6, buf.remaining());
1294    /// ```
1295    ///
1296    /// ```
1297    /// use bytes::{Buf, TryGetError};
1298    ///
1299    /// let mut buf = &b"\x08"[..];
1300    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_u16_le());
1301    /// assert_eq!(1, buf.remaining());
1302    /// ```
1303    fn try_get_u16_le(&mut self) -> Result<u16, TryGetError> {
1304        buf_try_get_impl!(self, u16::from_le_bytes)
1305    }
1306
1307    /// Gets an unsigned 16 bit integer from `self` in native-endian byte order.
1308    ///
1309    /// The current position is advanced by 2.
1310    ///
1311    /// Returns `Err(TryGetError)` when there are not enough
1312    /// remaining bytes to read the value.
1313    ///
1314    /// # Examples
1315    ///
1316    /// ```
1317    /// use bytes::Buf;
1318    ///
1319    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1320    ///     true => b"\x08\x09 hello",
1321    ///     false => b"\x09\x08 hello",
1322    /// };
1323    /// assert_eq!(Ok(0x0809_u16), buf.try_get_u16_ne());
1324    /// assert_eq!(6, buf.remaining());
1325    /// ```
1326    ///
1327    /// ```
1328    /// use bytes::{Buf, TryGetError};
1329    ///
1330    /// let mut buf = &b"\x08"[..];
1331    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_u16_ne());
1332    /// assert_eq!(1, buf.remaining());
1333    /// ```
1334    fn try_get_u16_ne(&mut self) -> Result<u16, TryGetError> {
1335        buf_try_get_impl!(self, u16::from_ne_bytes)
1336    }
1337
1338    /// Gets a signed 16 bit integer from `self` in big-endian byte order.
1339    ///
1340    /// The current position is advanced by 2.
1341    ///
1342    /// Returns `Err(TryGetError)` when there are not enough
1343    /// remaining bytes to read the value.
1344    ///
1345    /// # Examples
1346    ///
1347    /// ```
1348    /// use bytes::Buf;
1349    ///
1350    /// let mut buf = &b"\x08\x09 hello"[..];
1351    /// assert_eq!(Ok(0x0809_i16), buf.try_get_i16());
1352    /// assert_eq!(6, buf.remaining());
1353    /// ```
1354    ///
1355    /// ```
1356    /// use bytes::{Buf, TryGetError};
1357    ///
1358    /// let mut buf = &b"\x08"[..];
1359    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_i16());
1360    /// assert_eq!(1, buf.remaining());
1361    /// ```
1362    fn try_get_i16(&mut self) -> Result<i16, TryGetError> {
1363        buf_try_get_impl!(self, i16::from_be_bytes)
1364    }
1365
1366    /// Gets an signed 16 bit integer from `self` in little-endian byte order.
1367    ///
1368    /// The current position is advanced by 2.
1369    ///
1370    /// Returns `Err(TryGetError)` when there are not enough
1371    /// remaining bytes to read the value.
1372    ///
1373    /// # Examples
1374    ///
1375    /// ```
1376    /// use bytes::Buf;
1377    ///
1378    /// let mut buf = &b"\x09\x08 hello"[..];
1379    /// assert_eq!(Ok(0x0809_i16), buf.try_get_i16_le());
1380    /// assert_eq!(6, buf.remaining());
1381    /// ```
1382    ///
1383    /// ```
1384    /// use bytes::{Buf, TryGetError};
1385    ///
1386    /// let mut buf = &b"\x08"[..];
1387    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_i16_le());
1388    /// assert_eq!(1, buf.remaining());
1389    /// ```
1390    fn try_get_i16_le(&mut self) -> Result<i16, TryGetError> {
1391        buf_try_get_impl!(self, i16::from_le_bytes)
1392    }
1393
1394    /// Gets a signed 16 bit integer from `self` in native-endian byte order.
1395    ///
1396    /// The current position is advanced by 2.
1397    ///
1398    /// Returns `Err(TryGetError)` when there are not enough
1399    /// remaining bytes to read the value.
1400    ///
1401    /// # Examples
1402    ///
1403    /// ```
1404    /// use bytes::Buf;
1405    ///
1406    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1407    ///     true => b"\x08\x09 hello",
1408    ///     false => b"\x09\x08 hello",
1409    /// };
1410    /// assert_eq!(Ok(0x0809_i16), buf.try_get_i16_ne());
1411    /// assert_eq!(6, buf.remaining());
1412    /// ```
1413    ///
1414    /// ```
1415    /// use bytes::{Buf, TryGetError};
1416    ///
1417    /// let mut buf = &b"\x08"[..];
1418    /// assert_eq!(Err(TryGetError{requested: 2, available: 1}), buf.try_get_i16_ne());
1419    /// assert_eq!(1, buf.remaining());
1420    /// ```
1421    fn try_get_i16_ne(&mut self) -> Result<i16, TryGetError> {
1422        buf_try_get_impl!(self, i16::from_ne_bytes)
1423    }
1424
1425    /// Gets an unsigned 32 bit integer from `self` in big-endian byte order.
1426    ///
1427    /// The current position is advanced by 4.
1428    ///
1429    /// Returns `Err(TryGetError)` when there are not enough
1430    /// remaining bytes to read the value.
1431    ///
1432    /// # Examples
1433    ///
1434    /// ```
1435    /// use bytes::Buf;
1436    ///
1437    /// let mut buf = &b"\x08\x09\xA0\xA1 hello"[..];
1438    /// assert_eq!(Ok(0x0809A0A1), buf.try_get_u32());
1439    /// assert_eq!(6, buf.remaining());
1440    /// ```
1441    ///
1442    /// ```
1443    /// use bytes::{Buf, TryGetError};
1444    ///
1445    /// let mut buf = &b"\x01\x02\x03"[..];
1446    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_u32());
1447    /// assert_eq!(3, buf.remaining());
1448    /// ```
1449    fn try_get_u32(&mut self) -> Result<u32, TryGetError> {
1450        buf_try_get_impl!(self, u32::from_be_bytes)
1451    }
1452
1453    /// Gets an unsigned 32 bit integer from `self` in little-endian byte order.
1454    ///
1455    /// The current position is advanced by 4.
1456    ///
1457    /// Returns `Err(TryGetError)` when there are not enough
1458    /// remaining bytes to read the value.
1459    ///
1460    /// # Examples
1461    ///
1462    /// ```
1463    /// use bytes::Buf;
1464    ///
1465    /// let mut buf = &b"\xA1\xA0\x09\x08 hello"[..];
1466    /// assert_eq!(Ok(0x0809A0A1_u32), buf.try_get_u32_le());
1467    /// assert_eq!(6, buf.remaining());
1468    /// ```
1469    ///
1470    /// ```
1471    /// use bytes::{Buf, TryGetError};
1472    ///
1473    /// let mut buf = &b"\x08\x09\xA0"[..];
1474    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_u32_le());
1475    /// assert_eq!(3, buf.remaining());
1476    /// ```
1477    fn try_get_u32_le(&mut self) -> Result<u32, TryGetError> {
1478        buf_try_get_impl!(self, u32::from_le_bytes)
1479    }
1480
1481    /// Gets an unsigned 32 bit integer from `self` in native-endian byte order.
1482    ///
1483    /// The current position is advanced by 4.
1484    ///
1485    /// Returns `Err(TryGetError)` when there are not enough
1486    /// remaining bytes to read the value.
1487    ///
1488    /// # Examples
1489    ///
1490    /// ```
1491    /// use bytes::Buf;
1492    ///
1493    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1494    ///     true => b"\x08\x09\xA0\xA1 hello",
1495    ///     false => b"\xA1\xA0\x09\x08 hello",
1496    /// };
1497    /// assert_eq!(Ok(0x0809A0A1_u32), buf.try_get_u32_ne());
1498    /// assert_eq!(6, buf.remaining());
1499    /// ```
1500    ///
1501    /// ```
1502    /// use bytes::{Buf, TryGetError};
1503    ///
1504    /// let mut buf = &b"\x08\x09\xA0"[..];
1505    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_u32_ne());
1506    /// assert_eq!(3, buf.remaining());
1507    /// ```
1508    fn try_get_u32_ne(&mut self) -> Result<u32, TryGetError> {
1509        buf_try_get_impl!(self, u32::from_ne_bytes)
1510    }
1511
1512    /// Gets a signed 32 bit integer from `self` in big-endian byte order.
1513    ///
1514    /// The current position is advanced by 4.
1515    ///
1516    /// Returns `Err(TryGetError)` when there are not enough
1517    /// remaining bytes to read the value.
1518    ///
1519    /// # Examples
1520    ///
1521    /// ```
1522    /// use bytes::Buf;
1523    ///
1524    /// let mut buf = &b"\x08\x09\xA0\xA1 hello"[..];
1525    /// assert_eq!(Ok(0x0809A0A1_i32), buf.try_get_i32());
1526    /// assert_eq!(6, buf.remaining());
1527    /// ```
1528    ///
1529    /// ```
1530    /// use bytes::{Buf, TryGetError};
1531    ///
1532    /// let mut buf = &b"\x01\x02\x03"[..];
1533    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_i32());
1534    /// assert_eq!(3, buf.remaining());
1535    /// ```
1536    fn try_get_i32(&mut self) -> Result<i32, TryGetError> {
1537        buf_try_get_impl!(self, i32::from_be_bytes)
1538    }
1539
1540    /// Gets a signed 32 bit integer from `self` in little-endian byte order.
1541    ///
1542    /// The current position is advanced by 4.
1543    ///
1544    /// Returns `Err(TryGetError)` when there are not enough
1545    /// remaining bytes to read the value.
1546    ///
1547    /// # Examples
1548    ///
1549    /// ```
1550    /// use bytes::Buf;
1551    ///
1552    /// let mut buf = &b"\xA1\xA0\x09\x08 hello"[..];
1553    /// assert_eq!(Ok(0x0809A0A1_i32), buf.try_get_i32_le());
1554    /// assert_eq!(6, buf.remaining());
1555    /// ```
1556    ///
1557    /// ```
1558    /// use bytes::{Buf, TryGetError};
1559    ///
1560    /// let mut buf = &b"\x08\x09\xA0"[..];
1561    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_i32_le());
1562    /// assert_eq!(3, buf.remaining());
1563    /// ```
1564    fn try_get_i32_le(&mut self) -> Result<i32, TryGetError> {
1565        buf_try_get_impl!(self, i32::from_le_bytes)
1566    }
1567
1568    /// Gets a signed 32 bit integer from `self` in native-endian byte order.
1569    ///
1570    /// The current position is advanced by 4.
1571    ///
1572    /// Returns `Err(TryGetError)` when there are not enough
1573    /// remaining bytes to read the value.
1574    ///
1575    /// # Examples
1576    ///
1577    /// ```
1578    /// use bytes::Buf;
1579    ///
1580    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1581    ///     true => b"\x08\x09\xA0\xA1 hello",
1582    ///     false => b"\xA1\xA0\x09\x08 hello",
1583    /// };
1584    /// assert_eq!(Ok(0x0809A0A1_i32), buf.try_get_i32_ne());
1585    /// assert_eq!(6, buf.remaining());
1586    /// ```
1587    ///
1588    /// ```
1589    /// use bytes::{Buf, TryGetError};
1590    ///
1591    /// let mut buf = &b"\x08\x09\xA0"[..];
1592    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_i32_ne());
1593    /// assert_eq!(3, buf.remaining());
1594    /// ```
1595    fn try_get_i32_ne(&mut self) -> Result<i32, TryGetError> {
1596        buf_try_get_impl!(self, i32::from_ne_bytes)
1597    }
1598
1599    /// Gets an unsigned 64 bit integer from `self` in big-endian byte order.
1600    ///
1601    /// The current position is advanced by 8.
1602    ///
1603    /// Returns `Err(TryGetError)` when there are not enough
1604    /// remaining bytes to read the value.
1605    ///
1606    /// # Examples
1607    ///
1608    /// ```
1609    /// use bytes::Buf;
1610    ///
1611    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08 hello"[..];
1612    /// assert_eq!(Ok(0x0102030405060708_u64), buf.try_get_u64());
1613    /// assert_eq!(6, buf.remaining());
1614    /// ```
1615    ///
1616    /// ```
1617    /// use bytes::{Buf, TryGetError};
1618    ///
1619    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07"[..];
1620    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_u64());
1621    /// assert_eq!(7, buf.remaining());
1622    /// ```
1623    fn try_get_u64(&mut self) -> Result<u64, TryGetError> {
1624        buf_try_get_impl!(self, u64::from_be_bytes)
1625    }
1626
1627    /// Gets an unsigned 64 bit integer from `self` in little-endian byte order.
1628    ///
1629    /// The current position is advanced by 8.
1630    ///
1631    /// Returns `Err(TryGetError)` when there are not enough
1632    /// remaining bytes to read the value.
1633    ///
1634    /// # Examples
1635    ///
1636    /// ```
1637    /// use bytes::Buf;
1638    ///
1639    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
1640    /// assert_eq!(Ok(0x0102030405060708_u64), buf.try_get_u64_le());
1641    /// assert_eq!(6, buf.remaining());
1642    /// ```
1643    ///
1644    /// ```
1645    /// use bytes::{Buf, TryGetError};
1646    ///
1647    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02"[..];
1648    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_u64_le());
1649    /// assert_eq!(7, buf.remaining());
1650    /// ```
1651    fn try_get_u64_le(&mut self) -> Result<u64, TryGetError> {
1652        buf_try_get_impl!(self, u64::from_le_bytes)
1653    }
1654
1655    /// Gets an unsigned 64 bit integer from `self` in native-endian byte order.
1656    ///
1657    /// The current position is advanced by 8.
1658    ///
1659    /// Returns `Err(TryGetError)` when there are not enough
1660    /// remaining bytes to read the value.
1661    ///
1662    /// # Examples
1663    ///
1664    /// ```
1665    /// use bytes::Buf;
1666    ///
1667    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1668    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08 hello",
1669    ///     false => b"\x08\x07\x06\x05\x04\x03\x02\x01 hello",
1670    /// };
1671    /// assert_eq!(Ok(0x0102030405060708_u64), buf.try_get_u64_ne());
1672    /// assert_eq!(6, buf.remaining());
1673    /// ```
1674    ///
1675    /// ```
1676    /// use bytes::{Buf, TryGetError};
1677    ///
1678    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07"[..];
1679    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_u64_ne());
1680    /// assert_eq!(7, buf.remaining());
1681    /// ```
1682    fn try_get_u64_ne(&mut self) -> Result<u64, TryGetError> {
1683        buf_try_get_impl!(self, u64::from_ne_bytes)
1684    }
1685
1686    /// Gets a signed 64 bit integer from `self` in big-endian byte order.
1687    ///
1688    /// The current position is advanced by 8.
1689    ///
1690    /// Returns `Err(TryGetError)` when there are not enough
1691    /// remaining bytes to read the value.
1692    ///
1693    /// # Examples
1694    ///
1695    /// ```
1696    /// use bytes::Buf;
1697    ///
1698    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08 hello"[..];
1699    /// assert_eq!(Ok(0x0102030405060708_i64), buf.try_get_i64());
1700    /// assert_eq!(6, buf.remaining());
1701    /// ```
1702    ///
1703    /// ```
1704    /// use bytes::{Buf, TryGetError};
1705    ///
1706    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07"[..];
1707    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_i64());
1708    /// assert_eq!(7, buf.remaining());
1709    /// ```
1710    fn try_get_i64(&mut self) -> Result<i64, TryGetError> {
1711        buf_try_get_impl!(self, i64::from_be_bytes)
1712    }
1713
1714    /// Gets a signed 64 bit integer from `self` in little-endian byte order.
1715    ///
1716    /// The current position is advanced by 8.
1717    ///
1718    /// Returns `Err(TryGetError)` when there are not enough
1719    /// remaining bytes to read the value.
1720    ///
1721    /// # Examples
1722    ///
1723    /// ```
1724    /// use bytes::Buf;
1725    ///
1726    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
1727    /// assert_eq!(Ok(0x0102030405060708_i64), buf.try_get_i64_le());
1728    /// assert_eq!(6, buf.remaining());
1729    /// ```
1730    ///
1731    /// ```
1732    /// use bytes::{Buf, TryGetError};
1733    ///
1734    /// let mut buf = &b"\x08\x07\x06\x05\x04\x03\x02"[..];
1735    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_i64_le());
1736    /// assert_eq!(7, buf.remaining());
1737    /// ```
1738    fn try_get_i64_le(&mut self) -> Result<i64, TryGetError> {
1739        buf_try_get_impl!(self, i64::from_le_bytes)
1740    }
1741
1742    /// Gets a signed 64 bit integer from `self` in native-endian byte order.
1743    ///
1744    /// The current position is advanced by 8.
1745    ///
1746    /// Returns `Err(TryGetError)` when there are not enough
1747    /// remaining bytes to read the value.
1748    ///
1749    /// # Examples
1750    ///
1751    /// ```
1752    /// use bytes::Buf;
1753    ///
1754    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1755    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08 hello",
1756    ///     false => b"\x08\x07\x06\x05\x04\x03\x02\x01 hello",
1757    /// };
1758    /// assert_eq!(Ok(0x0102030405060708_i64), buf.try_get_i64_ne());
1759    /// assert_eq!(6, buf.remaining());
1760    /// ```
1761    ///
1762    /// ```
1763    /// use bytes::{Buf, TryGetError};
1764    ///
1765    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07"[..];
1766    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_i64_ne());
1767    /// assert_eq!(7, buf.remaining());
1768    /// ```
1769    fn try_get_i64_ne(&mut self) -> Result<i64, TryGetError> {
1770        buf_try_get_impl!(self, i64::from_ne_bytes)
1771    }
1772
1773    /// Gets an unsigned 128 bit integer from `self` in big-endian byte order.
1774    ///
1775    /// The current position is advanced by 16.
1776    ///
1777    /// Returns `Err(TryGetError)` when there are not enough
1778    /// remaining bytes to read the value.
1779    ///
1780    /// # Examples
1781    ///
1782    /// ```
1783    /// use bytes::Buf;
1784    ///
1785    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello"[..];
1786    /// assert_eq!(Ok(0x01020304050607080910111213141516_u128), buf.try_get_u128());
1787    /// assert_eq!(6, buf.remaining());
1788    /// ```
1789    ///
1790    /// ```
1791    /// use bytes::{Buf, TryGetError};
1792    ///
1793    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15"[..];
1794    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_u128());
1795    /// assert_eq!(15, buf.remaining());
1796    /// ```
1797    fn try_get_u128(&mut self) -> Result<u128, TryGetError> {
1798        buf_try_get_impl!(self, u128::from_be_bytes)
1799    }
1800
1801    /// Gets an unsigned 128 bit integer from `self` in little-endian byte order.
1802    ///
1803    /// The current position is advanced by 16.
1804    ///
1805    /// Returns `Err(TryGetError)` when there are not enough
1806    /// remaining bytes to read the value.
1807    ///
1808    /// # Examples
1809    ///
1810    /// ```
1811    /// use bytes::Buf;
1812    ///
1813    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
1814    /// assert_eq!(Ok(0x01020304050607080910111213141516_u128), buf.try_get_u128_le());
1815    /// assert_eq!(6, buf.remaining());
1816    /// ```
1817    ///
1818    /// ```
1819    /// use bytes::{Buf, TryGetError};
1820    ///
1821    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02"[..];
1822    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_u128_le());
1823    /// assert_eq!(15, buf.remaining());
1824    /// ```
1825    fn try_get_u128_le(&mut self) -> Result<u128, TryGetError> {
1826        buf_try_get_impl!(self, u128::from_le_bytes)
1827    }
1828
1829    /// Gets an unsigned 128 bit integer from `self` in native-endian byte order.
1830    ///
1831    /// The current position is advanced by 16.
1832    ///
1833    /// Returns `Err(TryGetError)` when there are not enough
1834    /// remaining bytes to read the value.
1835    ///
1836    /// # Examples
1837    ///
1838    /// ```
1839    /// use bytes::Buf;
1840    ///
1841    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1842    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello",
1843    ///     false => b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello",
1844    /// };
1845    /// assert_eq!(Ok(0x01020304050607080910111213141516_u128), buf.try_get_u128_ne());
1846    /// assert_eq!(6, buf.remaining());
1847    /// ```
1848    ///
1849    /// ```
1850    /// use bytes::{Buf, TryGetError};
1851    ///
1852    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15"[..];
1853    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_u128_ne());
1854    /// assert_eq!(15, buf.remaining());
1855    /// ```
1856    fn try_get_u128_ne(&mut self) -> Result<u128, TryGetError> {
1857        buf_try_get_impl!(self, u128::from_ne_bytes)
1858    }
1859
1860    /// Gets a signed 128 bit integer from `self` in big-endian byte order.
1861    ///
1862    /// The current position is advanced by 16.
1863    ///
1864    /// Returns `Err(TryGetError)` when there are not enough
1865    /// remaining bytes to read the value.
1866    ///
1867    /// # Examples
1868    ///
1869    /// ```
1870    /// use bytes::Buf;
1871    ///
1872    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello"[..];
1873    /// assert_eq!(Ok(0x01020304050607080910111213141516_i128), buf.try_get_i128());
1874    /// assert_eq!(6, buf.remaining());
1875    /// ```
1876    ///
1877    /// ```
1878    /// use bytes::{Buf, TryGetError};
1879    ///
1880    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15"[..];
1881    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_i128());
1882    /// assert_eq!(15, buf.remaining());
1883    /// ```
1884    fn try_get_i128(&mut self) -> Result<i128, TryGetError> {
1885        buf_try_get_impl!(self, i128::from_be_bytes)
1886    }
1887
1888    /// Gets a signed 128 bit integer from `self` in little-endian byte order.
1889    ///
1890    /// The current position is advanced by 16.
1891    ///
1892    /// Returns `Err(TryGetError)` when there are not enough
1893    /// remaining bytes to read the value.
1894    ///
1895    /// # Examples
1896    ///
1897    /// ```
1898    /// use bytes::Buf;
1899    ///
1900    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello"[..];
1901    /// assert_eq!(Ok(0x01020304050607080910111213141516_i128), buf.try_get_i128_le());
1902    /// assert_eq!(6, buf.remaining());
1903    /// ```
1904    ///
1905    /// ```
1906    /// use bytes::{Buf, TryGetError};
1907    ///
1908    /// let mut buf = &b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02"[..];
1909    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_i128_le());
1910    /// assert_eq!(15, buf.remaining());
1911    /// ```
1912    fn try_get_i128_le(&mut self) -> Result<i128, TryGetError> {
1913        buf_try_get_impl!(self, i128::from_le_bytes)
1914    }
1915
1916    /// Gets a signed 128 bit integer from `self` in native-endian byte order.
1917    ///
1918    /// The current position is advanced by 16.
1919    ///
1920    /// Returns `Err(TryGetError)` when there are not enough
1921    /// remaining bytes to read the value.
1922    ///
1923    /// # Examples
1924    ///
1925    /// ```
1926    /// use bytes::Buf;
1927    ///
1928    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
1929    ///     true => b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16 hello",
1930    ///     false => b"\x16\x15\x14\x13\x12\x11\x10\x09\x08\x07\x06\x05\x04\x03\x02\x01 hello",
1931    /// };
1932    /// assert_eq!(Ok(0x01020304050607080910111213141516_i128), buf.try_get_i128_ne());
1933    /// assert_eq!(6, buf.remaining());
1934    /// ```
1935    ///
1936    /// ```
1937    /// use bytes::{Buf, TryGetError};
1938    ///
1939    /// let mut buf = &b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15"[..];
1940    /// assert_eq!(Err(TryGetError{requested: 16, available: 15}), buf.try_get_i128_ne());
1941    /// assert_eq!(15, buf.remaining());
1942    /// ```
1943    fn try_get_i128_ne(&mut self) -> Result<i128, TryGetError> {
1944        buf_try_get_impl!(self, i128::from_ne_bytes)
1945    }
1946
1947    /// Gets an unsigned n-byte integer from `self` in big-endian byte order.
1948    ///
1949    /// The current position is advanced by `nbytes`.
1950    ///
1951    /// Returns `Err(TryGetError)` when there are not enough
1952    /// remaining bytes to read the value.
1953    ///
1954    /// # Examples
1955    ///
1956    /// ```
1957    /// use bytes::Buf;
1958    ///
1959    /// let mut buf = &b"\x01\x02\x03 hello"[..];
1960    /// assert_eq!(Ok(0x010203_u64), buf.try_get_uint(3));
1961    /// assert_eq!(6, buf.remaining());
1962    /// ```
1963    ///
1964    /// ```
1965    /// use bytes::{Buf, TryGetError};
1966    ///
1967    /// let mut buf = &b"\x01\x02\x03"[..];
1968    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_uint(4));
1969    /// assert_eq!(3, buf.remaining());
1970    /// ```
1971    ///
1972    /// # Panics
1973    ///
1974    /// This function panics if `nbytes` > 8.
1975    fn try_get_uint(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
1976        buf_try_get_impl!(be => self, u64, nbytes);
1977    }
1978
1979    /// Gets an unsigned n-byte integer from `self` in little-endian byte order.
1980    ///
1981    /// The current position is advanced by `nbytes`.
1982    ///
1983    /// Returns `Err(TryGetError)` when there are not enough
1984    /// remaining bytes to read the value.
1985    ///
1986    /// # Examples
1987    ///
1988    /// ```
1989    /// use bytes::Buf;
1990    ///
1991    /// let mut buf = &b"\x03\x02\x01 hello"[..];
1992    /// assert_eq!(Ok(0x010203_u64), buf.try_get_uint_le(3));
1993    /// assert_eq!(6, buf.remaining());
1994    /// ```
1995    ///
1996    /// ```
1997    /// use bytes::{Buf, TryGetError};
1998    ///
1999    /// let mut buf = &b"\x01\x02\x03"[..];
2000    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_uint_le(4));
2001    /// assert_eq!(3, buf.remaining());
2002    /// ```
2003    ///
2004    /// # Panics
2005    ///
2006    /// This function panics if `nbytes` > 8.
2007    fn try_get_uint_le(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
2008        buf_try_get_impl!(le => self, u64, nbytes);
2009    }
2010
2011    /// Gets an unsigned n-byte integer from `self` in native-endian byte order.
2012    ///
2013    /// The current position is advanced by `nbytes`.
2014    ///
2015    /// Returns `Err(TryGetError)` when there are not enough
2016    /// remaining bytes to read the value.
2017    ///
2018    /// # Examples
2019    ///
2020    /// ```
2021    /// use bytes::Buf;
2022    ///
2023    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2024    ///     true => b"\x01\x02\x03 hello",
2025    ///     false => b"\x03\x02\x01 hello",
2026    /// };
2027    /// assert_eq!(Ok(0x010203_u64), buf.try_get_uint_ne(3));
2028    /// assert_eq!(6, buf.remaining());
2029    /// ```
2030    ///
2031    /// ```
2032    /// use bytes::{Buf, TryGetError};
2033    ///
2034    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2035    ///     true => b"\x01\x02\x03",
2036    ///     false => b"\x03\x02\x01",
2037    /// };
2038    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_uint_ne(4));
2039    /// assert_eq!(3, buf.remaining());
2040    /// ```
2041    ///
2042    /// # Panics
2043    ///
2044    /// This function panics if `nbytes` is greater than 8.
2045    fn try_get_uint_ne(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
2046        if cfg!(target_endian = "big") {
2047            self.try_get_uint(nbytes)
2048        } else {
2049            self.try_get_uint_le(nbytes)
2050        }
2051    }
2052
2053    /// Gets a signed n-byte integer from `self` in big-endian byte order.
2054    ///
2055    /// The current position is advanced by `nbytes`.
2056    ///
2057    /// Returns `Err(TryGetError)` when there are not enough
2058    /// remaining bytes to read the value.
2059    ///
2060    /// # Examples
2061    ///
2062    /// ```
2063    /// use bytes::Buf;
2064    ///
2065    /// let mut buf = &b"\x01\x02\x03 hello"[..];
2066    /// assert_eq!(Ok(0x010203_i64), buf.try_get_int(3));
2067    /// assert_eq!(6, buf.remaining());
2068    /// ```
2069    ///
2070    /// ```
2071    /// use bytes::{Buf, TryGetError};
2072    ///
2073    /// let mut buf = &b"\x01\x02\x03"[..];
2074    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_int(4));
2075    /// assert_eq!(3, buf.remaining());
2076    /// ```
2077    ///
2078    /// # Panics
2079    ///
2080    /// This function panics if `nbytes` is greater than 8.
2081    fn try_get_int(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2082        buf_try_get_impl!(be => self, i64, nbytes);
2083    }
2084
2085    /// Gets a signed n-byte integer from `self` in little-endian byte order.
2086    ///
2087    /// The current position is advanced by `nbytes`.
2088    ///
2089    /// Returns `Err(TryGetError)` when there are not enough
2090    /// remaining bytes to read the value.
2091    ///
2092    /// # Examples
2093    ///
2094    /// ```
2095    /// use bytes::Buf;
2096    ///
2097    /// let mut buf = &b"\x03\x02\x01 hello"[..];
2098    /// assert_eq!(Ok(0x010203_i64), buf.try_get_int_le(3));
2099    /// assert_eq!(6, buf.remaining());
2100    /// ```
2101    ///
2102    /// ```
2103    /// use bytes::{Buf, TryGetError};
2104    ///
2105    /// let mut buf = &b"\x01\x02\x03"[..];
2106    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_int_le(4));
2107    /// assert_eq!(3, buf.remaining());
2108    /// ```
2109    ///
2110    /// # Panics
2111    ///
2112    /// This function panics if `nbytes` is greater than 8.
2113    fn try_get_int_le(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2114        buf_try_get_impl!(le => self, i64, nbytes);
2115    }
2116
2117    /// Gets a signed n-byte integer from `self` in native-endian byte order.
2118    ///
2119    /// The current position is advanced by `nbytes`.
2120    ///
2121    /// Returns `Err(TryGetError)` when there are not enough
2122    /// remaining bytes to read the value.
2123    ///
2124    /// # Examples
2125    ///
2126    /// ```
2127    /// use bytes::Buf;
2128    ///
2129    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2130    ///     true => b"\x01\x02\x03 hello",
2131    ///     false => b"\x03\x02\x01 hello",
2132    /// };
2133    /// assert_eq!(Ok(0x010203_i64), buf.try_get_int_ne(3));
2134    /// assert_eq!(6, buf.remaining());
2135    /// ```
2136    ///
2137    /// ```
2138    /// use bytes::{Buf, TryGetError};
2139    ///
2140    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2141    ///     true => b"\x01\x02\x03",
2142    ///     false => b"\x03\x02\x01",
2143    /// };
2144    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_int_ne(4));
2145    /// assert_eq!(3, buf.remaining());
2146    /// ```
2147    ///
2148    /// # Panics
2149    ///
2150    /// This function panics if `nbytes` is greater than 8.
2151    fn try_get_int_ne(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2152        if cfg!(target_endian = "big") {
2153            self.try_get_int(nbytes)
2154        } else {
2155            self.try_get_int_le(nbytes)
2156        }
2157    }
2158
2159    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
2160    /// `self` in big-endian byte order.
2161    ///
2162    /// The current position is advanced by 4.
2163    ///
2164    /// Returns `Err(TryGetError)` when there are not enough
2165    /// remaining bytes to read the value.
2166    ///
2167    /// # Examples
2168    ///
2169    /// ```
2170    /// use bytes::Buf;
2171    ///
2172    /// let mut buf = &b"\x3F\x99\x99\x9A hello"[..];
2173    /// assert_eq!(1.2f32, buf.get_f32());
2174    /// assert_eq!(6, buf.remaining());
2175    /// ```
2176    ///
2177    /// ```
2178    /// use bytes::{Buf, TryGetError};
2179    ///
2180    /// let mut buf = &b"\x3F\x99\x99"[..];
2181    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_f32());
2182    /// assert_eq!(3, buf.remaining());
2183    /// ```
2184    fn try_get_f32(&mut self) -> Result<f32, TryGetError> {
2185        Ok(f32::from_bits(self.try_get_u32()?))
2186    }
2187
2188    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
2189    /// `self` in little-endian byte order.
2190    ///
2191    /// The current position is advanced by 4.
2192    ///
2193    /// Returns `Err(TryGetError)` when there are not enough
2194    /// remaining bytes to read the value.
2195    ///
2196    /// # Examples
2197    ///
2198    /// ```
2199    /// use bytes::Buf;
2200    ///
2201    /// let mut buf = &b"\x9A\x99\x99\x3F hello"[..];
2202    /// assert_eq!(1.2f32, buf.get_f32_le());
2203    /// assert_eq!(6, buf.remaining());
2204    /// ```
2205    ///
2206    /// ```
2207    /// use bytes::{Buf, TryGetError};
2208    ///
2209    /// let mut buf = &b"\x3F\x99\x99"[..];
2210    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_f32_le());
2211    /// assert_eq!(3, buf.remaining());
2212    /// ```
2213    fn try_get_f32_le(&mut self) -> Result<f32, TryGetError> {
2214        Ok(f32::from_bits(self.try_get_u32_le()?))
2215    }
2216
2217    /// Gets an IEEE754 single-precision (4 bytes) floating point number from
2218    /// `self` in native-endian byte order.
2219    ///
2220    /// The current position is advanced by 4.
2221    ///
2222    /// Returns `Err(TryGetError)` when there are not enough
2223    /// remaining bytes to read the value.
2224    ///
2225    /// # Examples
2226    ///
2227    /// ```
2228    /// use bytes::Buf;
2229    ///
2230    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2231    ///     true => b"\x3F\x99\x99\x9A hello",
2232    ///     false => b"\x9A\x99\x99\x3F hello",
2233    /// };
2234    /// assert_eq!(1.2f32, buf.get_f32_ne());
2235    /// assert_eq!(6, buf.remaining());
2236    /// ```
2237    ///
2238    /// ```
2239    /// use bytes::{Buf, TryGetError};
2240    ///
2241    /// let mut buf = &b"\x3F\x99\x99"[..];
2242    /// assert_eq!(Err(TryGetError{requested: 4, available: 3}), buf.try_get_f32_ne());
2243    /// assert_eq!(3, buf.remaining());
2244    /// ```
2245    fn try_get_f32_ne(&mut self) -> Result<f32, TryGetError> {
2246        Ok(f32::from_bits(self.try_get_u32_ne()?))
2247    }
2248
2249    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
2250    /// `self` in big-endian byte order.
2251    ///
2252    /// The current position is advanced by 8.
2253    ///
2254    /// Returns `Err(TryGetError)` when there are not enough
2255    /// remaining bytes to read the value.
2256    ///
2257    /// # Examples
2258    ///
2259    /// ```
2260    /// use bytes::Buf;
2261    ///
2262    /// let mut buf = &b"\x3F\xF3\x33\x33\x33\x33\x33\x33 hello"[..];
2263    /// assert_eq!(1.2f64, buf.get_f64());
2264    /// assert_eq!(6, buf.remaining());
2265    /// ```
2266    ///
2267    /// ```
2268    /// use bytes::{Buf, TryGetError};
2269    ///
2270    /// let mut buf = &b"\x3F\xF3\x33\x33\x33\x33\x33"[..];
2271    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_f64());
2272    /// assert_eq!(7, buf.remaining());
2273    /// ```
2274    fn try_get_f64(&mut self) -> Result<f64, TryGetError> {
2275        Ok(f64::from_bits(self.try_get_u64()?))
2276    }
2277
2278    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
2279    /// `self` in little-endian byte order.
2280    ///
2281    /// The current position is advanced by 8.
2282    ///
2283    /// Returns `Err(TryGetError)` when there are not enough
2284    /// remaining bytes to read the value.
2285    ///
2286    /// # Examples
2287    ///
2288    /// ```
2289    /// use bytes::Buf;
2290    ///
2291    /// let mut buf = &b"\x33\x33\x33\x33\x33\x33\xF3\x3F hello"[..];
2292    /// assert_eq!(1.2f64, buf.get_f64_le());
2293    /// assert_eq!(6, buf.remaining());
2294    /// ```
2295    ///
2296    /// ```
2297    /// use bytes::{Buf, TryGetError};
2298    ///
2299    /// let mut buf = &b"\x3F\xF3\x33\x33\x33\x33\x33"[..];
2300    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_f64_le());
2301    /// assert_eq!(7, buf.remaining());
2302    /// ```
2303    fn try_get_f64_le(&mut self) -> Result<f64, TryGetError> {
2304        Ok(f64::from_bits(self.try_get_u64_le()?))
2305    }
2306
2307    /// Gets an IEEE754 double-precision (8 bytes) floating point number from
2308    /// `self` in native-endian byte order.
2309    ///
2310    /// The current position is advanced by 8.
2311    ///
2312    /// Returns `Err(TryGetError)` when there are not enough
2313    /// remaining bytes to read the value.
2314    ///
2315    /// # Examples
2316    ///
2317    /// ```
2318    /// use bytes::Buf;
2319    ///
2320    /// let mut buf: &[u8] = match cfg!(target_endian = "big") {
2321    ///     true => b"\x3F\xF3\x33\x33\x33\x33\x33\x33 hello",
2322    ///     false => b"\x33\x33\x33\x33\x33\x33\xF3\x3F hello",
2323    /// };
2324    /// assert_eq!(1.2f64, buf.get_f64_ne());
2325    /// assert_eq!(6, buf.remaining());
2326    /// ```
2327    ///
2328    /// ```
2329    /// use bytes::{Buf, TryGetError};
2330    ///
2331    /// let mut buf = &b"\x3F\xF3\x33\x33\x33\x33\x33"[..];
2332    /// assert_eq!(Err(TryGetError{requested: 8, available: 7}), buf.try_get_f64_ne());
2333    /// assert_eq!(7, buf.remaining());
2334    /// ```
2335    fn try_get_f64_ne(&mut self) -> Result<f64, TryGetError> {
2336        Ok(f64::from_bits(self.try_get_u64_ne()?))
2337    }
2338
2339    /// Consumes `len` bytes inside self and returns new instance of `Bytes`
2340    /// with this data.
2341    ///
2342    /// This function may be optimized by the underlying type to avoid actual
2343    /// copies. For example, `Bytes` implementation will do a shallow copy
2344    /// (ref-count increment).
2345    ///
2346    /// # Examples
2347    ///
2348    /// ```
2349    /// use bytes::Buf;
2350    ///
2351    /// let bytes = (&b"hello world"[..]).copy_to_bytes(5);
2352    /// assert_eq!(&bytes[..], &b"hello"[..]);
2353    /// ```
2354    ///
2355    /// # Panics
2356    ///
2357    /// This function panics if `len > self.remaining()`.
2358    fn copy_to_bytes(&mut self, len: usize) -> crate::Bytes {
2359        use super::BufMut;
2360
2361        if self.remaining() < len {
2362            panic_advance(&TryGetError {
2363                requested: len,
2364                available: self.remaining(),
2365            });
2366        }
2367
2368        let mut ret = crate::BytesMut::with_capacity(len);
2369        ret.put(self.take(len));
2370        ret.freeze()
2371    }
2372
2373    /// Creates an adaptor which will read at most `limit` bytes from `self`.
2374    ///
2375    /// This function returns a new instance of `Buf` which will read at most
2376    /// `limit` bytes.
2377    ///
2378    /// # Examples
2379    ///
2380    /// ```
2381    /// use bytes::{Buf, BufMut};
2382    ///
2383    /// let mut buf = b"hello world"[..].take(5);
2384    /// let mut dst = vec![];
2385    ///
2386    /// dst.put(&mut buf);
2387    /// assert_eq!(dst, b"hello");
2388    ///
2389    /// let mut buf = buf.into_inner();
2390    /// dst.clear();
2391    /// dst.put(&mut buf);
2392    /// assert_eq!(dst, b" world");
2393    /// ```
2394    fn take(self, limit: usize) -> Take<Self>
2395    where
2396        Self: Sized,
2397    {
2398        take::new(self, limit)
2399    }
2400
2401    /// Creates an adaptor which will chain this buffer with another.
2402    ///
2403    /// The returned `Buf` instance will first consume all bytes from `self`.
2404    /// Afterwards the output is equivalent to the output of next.
2405    ///
2406    /// # Examples
2407    ///
2408    /// ```
2409    /// use bytes::Buf;
2410    ///
2411    /// let mut chain = b"hello "[..].chain(&b"world"[..]);
2412    ///
2413    /// let full = chain.copy_to_bytes(11);
2414    /// assert_eq!(full.chunk(), b"hello world");
2415    /// ```
2416    fn chain<U: Buf>(self, next: U) -> Chain<Self, U>
2417    where
2418        Self: Sized,
2419    {
2420        Chain::new(self, next)
2421    }
2422
2423    /// Creates an adaptor which implements the `Read` trait for `self`.
2424    ///
2425    /// This function returns a new value which implements `Read` by adapting
2426    /// the `Read` trait functions to the `Buf` trait functions. Given that
2427    /// `Buf` operations are infallible, none of the `Read` functions will
2428    /// return with `Err`.
2429    ///
2430    /// # Examples
2431    ///
2432    /// ```
2433    /// use bytes::{Bytes, Buf};
2434    /// use std::io::Read;
2435    ///
2436    /// let buf = Bytes::from("hello world");
2437    ///
2438    /// let mut reader = buf.reader();
2439    /// let mut dst = [0; 1024];
2440    ///
2441    /// let num = reader.read(&mut dst).unwrap();
2442    ///
2443    /// assert_eq!(11, num);
2444    /// assert_eq!(&dst[..11], &b"hello world"[..]);
2445    /// ```
2446    #[cfg(feature = "std")]
2447    #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2448    fn reader(self) -> Reader<Self>
2449    where
2450        Self: Sized,
2451    {
2452        reader::new(self)
2453    }
2454}
2455
2456macro_rules! deref_forward_buf {
2457    () => {
2458        #[inline]
2459        fn remaining(&self) -> usize {
2460            (**self).remaining()
2461        }
2462
2463        #[inline]
2464        fn chunk(&self) -> &[u8] {
2465            (**self).chunk()
2466        }
2467
2468        #[cfg(feature = "std")]
2469        #[inline]
2470        fn chunks_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize {
2471            (**self).chunks_vectored(dst)
2472        }
2473
2474        #[inline]
2475        fn advance(&mut self, cnt: usize) {
2476            (**self).advance(cnt)
2477        }
2478
2479        #[inline]
2480        fn has_remaining(&self) -> bool {
2481            (**self).has_remaining()
2482        }
2483
2484        #[inline]
2485        fn copy_to_slice(&mut self, dst: &mut [u8]) {
2486            (**self).copy_to_slice(dst)
2487        }
2488
2489        #[inline]
2490        fn get_u8(&mut self) -> u8 {
2491            (**self).get_u8()
2492        }
2493
2494        #[inline]
2495        fn get_i8(&mut self) -> i8 {
2496            (**self).get_i8()
2497        }
2498
2499        #[inline]
2500        fn get_u16(&mut self) -> u16 {
2501            (**self).get_u16()
2502        }
2503
2504        #[inline]
2505        fn get_u16_le(&mut self) -> u16 {
2506            (**self).get_u16_le()
2507        }
2508
2509        #[inline]
2510        fn get_u16_ne(&mut self) -> u16 {
2511            (**self).get_u16_ne()
2512        }
2513
2514        #[inline]
2515        fn get_i16(&mut self) -> i16 {
2516            (**self).get_i16()
2517        }
2518
2519        #[inline]
2520        fn get_i16_le(&mut self) -> i16 {
2521            (**self).get_i16_le()
2522        }
2523
2524        #[inline]
2525        fn get_i16_ne(&mut self) -> i16 {
2526            (**self).get_i16_ne()
2527        }
2528
2529        #[inline]
2530        fn get_u32(&mut self) -> u32 {
2531            (**self).get_u32()
2532        }
2533
2534        #[inline]
2535        fn get_u32_le(&mut self) -> u32 {
2536            (**self).get_u32_le()
2537        }
2538
2539        #[inline]
2540        fn get_u32_ne(&mut self) -> u32 {
2541            (**self).get_u32_ne()
2542        }
2543
2544        #[inline]
2545        fn get_i32(&mut self) -> i32 {
2546            (**self).get_i32()
2547        }
2548
2549        #[inline]
2550        fn get_i32_le(&mut self) -> i32 {
2551            (**self).get_i32_le()
2552        }
2553
2554        #[inline]
2555        fn get_i32_ne(&mut self) -> i32 {
2556            (**self).get_i32_ne()
2557        }
2558
2559        #[inline]
2560        fn get_u64(&mut self) -> u64 {
2561            (**self).get_u64()
2562        }
2563
2564        #[inline]
2565        fn get_u64_le(&mut self) -> u64 {
2566            (**self).get_u64_le()
2567        }
2568
2569        #[inline]
2570        fn get_u64_ne(&mut self) -> u64 {
2571            (**self).get_u64_ne()
2572        }
2573
2574        #[inline]
2575        fn get_i64(&mut self) -> i64 {
2576            (**self).get_i64()
2577        }
2578
2579        #[inline]
2580        fn get_i64_le(&mut self) -> i64 {
2581            (**self).get_i64_le()
2582        }
2583
2584        #[inline]
2585        fn get_i64_ne(&mut self) -> i64 {
2586            (**self).get_i64_ne()
2587        }
2588
2589        #[inline]
2590        fn get_u128(&mut self) -> u128 {
2591            (**self).get_u128()
2592        }
2593
2594        #[inline]
2595        fn get_u128_le(&mut self) -> u128 {
2596            (**self).get_u128_le()
2597        }
2598
2599        #[inline]
2600        fn get_u128_ne(&mut self) -> u128 {
2601            (**self).get_u128_ne()
2602        }
2603
2604        #[inline]
2605        fn get_i128(&mut self) -> i128 {
2606            (**self).get_i128()
2607        }
2608
2609        #[inline]
2610        fn get_i128_le(&mut self) -> i128 {
2611            (**self).get_i128_le()
2612        }
2613
2614        #[inline]
2615        fn get_i128_ne(&mut self) -> i128 {
2616            (**self).get_i128_ne()
2617        }
2618
2619        #[inline]
2620        fn get_uint(&mut self, nbytes: usize) -> u64 {
2621            (**self).get_uint(nbytes)
2622        }
2623
2624        #[inline]
2625        fn get_uint_le(&mut self, nbytes: usize) -> u64 {
2626            (**self).get_uint_le(nbytes)
2627        }
2628
2629        #[inline]
2630        fn get_uint_ne(&mut self, nbytes: usize) -> u64 {
2631            (**self).get_uint_ne(nbytes)
2632        }
2633
2634        #[inline]
2635        fn get_int(&mut self, nbytes: usize) -> i64 {
2636            (**self).get_int(nbytes)
2637        }
2638
2639        #[inline]
2640        fn get_int_le(&mut self, nbytes: usize) -> i64 {
2641            (**self).get_int_le(nbytes)
2642        }
2643
2644        #[inline]
2645        fn get_int_ne(&mut self, nbytes: usize) -> i64 {
2646            (**self).get_int_ne(nbytes)
2647        }
2648
2649        #[inline]
2650        fn get_f32(&mut self) -> f32 {
2651            (**self).get_f32()
2652        }
2653
2654        #[inline]
2655        fn get_f32_le(&mut self) -> f32 {
2656            (**self).get_f32_le()
2657        }
2658
2659        #[inline]
2660        fn get_f32_ne(&mut self) -> f32 {
2661            (**self).get_f32_ne()
2662        }
2663
2664        #[inline]
2665        fn get_f64(&mut self) -> f64 {
2666            (**self).get_f64()
2667        }
2668
2669        #[inline]
2670        fn get_f64_le(&mut self) -> f64 {
2671            (**self).get_f64_le()
2672        }
2673
2674        #[inline]
2675        fn get_f64_ne(&mut self) -> f64 {
2676            (**self).get_f64_ne()
2677        }
2678
2679        #[inline]
2680        fn try_copy_to_slice(&mut self, dst: &mut [u8]) -> Result<(), TryGetError> {
2681            (**self).try_copy_to_slice(dst)
2682        }
2683
2684        #[inline]
2685        fn try_get_u8(&mut self) -> Result<u8, TryGetError> {
2686            (**self).try_get_u8()
2687        }
2688
2689        #[inline]
2690        fn try_get_i8(&mut self) -> Result<i8, TryGetError> {
2691            (**self).try_get_i8()
2692        }
2693
2694        #[inline]
2695        fn try_get_u16(&mut self) -> Result<u16, TryGetError> {
2696            (**self).try_get_u16()
2697        }
2698
2699        #[inline]
2700        fn try_get_u16_le(&mut self) -> Result<u16, TryGetError> {
2701            (**self).try_get_u16_le()
2702        }
2703
2704        #[inline]
2705        fn try_get_u16_ne(&mut self) -> Result<u16, TryGetError> {
2706            (**self).try_get_u16_ne()
2707        }
2708
2709        #[inline]
2710        fn try_get_i16(&mut self) -> Result<i16, TryGetError> {
2711            (**self).try_get_i16()
2712        }
2713
2714        #[inline]
2715        fn try_get_i16_le(&mut self) -> Result<i16, TryGetError> {
2716            (**self).try_get_i16_le()
2717        }
2718
2719        #[inline]
2720        fn try_get_i16_ne(&mut self) -> Result<i16, TryGetError> {
2721            (**self).try_get_i16_ne()
2722        }
2723
2724        #[inline]
2725        fn try_get_u32(&mut self) -> Result<u32, TryGetError> {
2726            (**self).try_get_u32()
2727        }
2728
2729        #[inline]
2730        fn try_get_u32_le(&mut self) -> Result<u32, TryGetError> {
2731            (**self).try_get_u32_le()
2732        }
2733
2734        #[inline]
2735        fn try_get_u32_ne(&mut self) -> Result<u32, TryGetError> {
2736            (**self).try_get_u32_ne()
2737        }
2738
2739        #[inline]
2740        fn try_get_i32(&mut self) -> Result<i32, TryGetError> {
2741            (**self).try_get_i32()
2742        }
2743
2744        #[inline]
2745        fn try_get_i32_le(&mut self) -> Result<i32, TryGetError> {
2746            (**self).try_get_i32_le()
2747        }
2748
2749        #[inline]
2750        fn try_get_i32_ne(&mut self) -> Result<i32, TryGetError> {
2751            (**self).try_get_i32_ne()
2752        }
2753
2754        #[inline]
2755        fn try_get_u64(&mut self) -> Result<u64, TryGetError> {
2756            (**self).try_get_u64()
2757        }
2758
2759        #[inline]
2760        fn try_get_u64_le(&mut self) -> Result<u64, TryGetError> {
2761            (**self).try_get_u64_le()
2762        }
2763
2764        #[inline]
2765        fn try_get_u64_ne(&mut self) -> Result<u64, TryGetError> {
2766            (**self).try_get_u64_ne()
2767        }
2768
2769        #[inline]
2770        fn try_get_i64(&mut self) -> Result<i64, TryGetError> {
2771            (**self).try_get_i64()
2772        }
2773
2774        #[inline]
2775        fn try_get_i64_le(&mut self) -> Result<i64, TryGetError> {
2776            (**self).try_get_i64_le()
2777        }
2778
2779        #[inline]
2780        fn try_get_i64_ne(&mut self) -> Result<i64, TryGetError> {
2781            (**self).try_get_i64_ne()
2782        }
2783
2784        #[inline]
2785        fn try_get_u128(&mut self) -> Result<u128, TryGetError> {
2786            (**self).try_get_u128()
2787        }
2788
2789        #[inline]
2790        fn try_get_u128_le(&mut self) -> Result<u128, TryGetError> {
2791            (**self).try_get_u128_le()
2792        }
2793
2794        #[inline]
2795        fn try_get_u128_ne(&mut self) -> Result<u128, TryGetError> {
2796            (**self).try_get_u128_ne()
2797        }
2798
2799        #[inline]
2800        fn try_get_i128(&mut self) -> Result<i128, TryGetError> {
2801            (**self).try_get_i128()
2802        }
2803
2804        #[inline]
2805        fn try_get_i128_le(&mut self) -> Result<i128, TryGetError> {
2806            (**self).try_get_i128_le()
2807        }
2808
2809        #[inline]
2810        fn try_get_i128_ne(&mut self) -> Result<i128, TryGetError> {
2811            (**self).try_get_i128_ne()
2812        }
2813
2814        #[inline]
2815        fn try_get_uint(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
2816            (**self).try_get_uint(nbytes)
2817        }
2818
2819        #[inline]
2820        fn try_get_uint_le(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
2821            (**self).try_get_uint_le(nbytes)
2822        }
2823
2824        #[inline]
2825        fn try_get_uint_ne(&mut self, nbytes: usize) -> Result<u64, TryGetError> {
2826            (**self).try_get_uint_ne(nbytes)
2827        }
2828
2829        #[inline]
2830        fn try_get_int(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2831            (**self).try_get_int(nbytes)
2832        }
2833
2834        #[inline]
2835        fn try_get_int_le(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2836            (**self).try_get_int_le(nbytes)
2837        }
2838
2839        #[inline]
2840        fn try_get_int_ne(&mut self, nbytes: usize) -> Result<i64, TryGetError> {
2841            (**self).try_get_int_ne(nbytes)
2842        }
2843
2844        #[inline]
2845        fn try_get_f32(&mut self) -> Result<f32, TryGetError> {
2846            (**self).try_get_f32()
2847        }
2848
2849        #[inline]
2850        fn try_get_f32_le(&mut self) -> Result<f32, TryGetError> {
2851            (**self).try_get_f32_le()
2852        }
2853
2854        #[inline]
2855        fn try_get_f32_ne(&mut self) -> Result<f32, TryGetError> {
2856            (**self).try_get_f32_ne()
2857        }
2858
2859        #[inline]
2860        fn try_get_f64(&mut self) -> Result<f64, TryGetError> {
2861            (**self).try_get_f64()
2862        }
2863
2864        #[inline]
2865        fn try_get_f64_le(&mut self) -> Result<f64, TryGetError> {
2866            (**self).try_get_f64_le()
2867        }
2868
2869        #[inline]
2870        fn try_get_f64_ne(&mut self) -> Result<f64, TryGetError> {
2871            (**self).try_get_f64_ne()
2872        }
2873
2874        #[inline]
2875        fn copy_to_bytes(&mut self, len: usize) -> crate::Bytes {
2876            (**self).copy_to_bytes(len)
2877        }
2878    };
2879}
2880
2881impl<T: Buf + ?Sized> Buf for &mut T {
2882    deref_forward_buf!();
2883}
2884
2885impl<T: Buf + ?Sized> Buf for Box<T> {
2886    deref_forward_buf!();
2887}
2888
2889impl Buf for &[u8] {
2890    #[inline]
2891    fn remaining(&self) -> usize {
2892        self.len()
2893    }
2894
2895    #[inline]
2896    fn chunk(&self) -> &[u8] {
2897        self
2898    }
2899
2900    #[inline]
2901    fn advance(&mut self, cnt: usize) {
2902        if self.len() < cnt {
2903            panic_advance(&TryGetError {
2904                requested: cnt,
2905                available: self.len(),
2906            });
2907        }
2908
2909        *self = &self[cnt..];
2910    }
2911
2912    #[inline]
2913    fn copy_to_slice(&mut self, dst: &mut [u8]) {
2914        if self.len() < dst.len() {
2915            panic_advance(&TryGetError {
2916                requested: dst.len(),
2917                available: self.len(),
2918            });
2919        }
2920
2921        dst.copy_from_slice(&self[..dst.len()]);
2922        self.advance(dst.len());
2923    }
2924}
2925
2926#[cfg(feature = "std")]
2927impl<T: AsRef<[u8]>> Buf for std::io::Cursor<T> {
2928    #[inline]
2929    fn remaining(&self) -> usize {
2930        saturating_sub_usize_u64(self.get_ref().as_ref().len(), self.position())
2931    }
2932
2933    #[inline]
2934    fn chunk(&self) -> &[u8] {
2935        let slice = self.get_ref().as_ref();
2936        let pos = min_u64_usize(self.position(), slice.len());
2937        &slice[pos..]
2938    }
2939
2940    #[inline]
2941    fn advance(&mut self, cnt: usize) {
2942        let len = self.get_ref().as_ref().len();
2943        let pos = self.position();
2944
2945        // We intentionally allow `cnt == 0` here even if `pos > len`.
2946        let max_cnt = saturating_sub_usize_u64(len, pos);
2947        if cnt > max_cnt {
2948            panic_advance(&TryGetError {
2949                requested: cnt,
2950                available: max_cnt,
2951            });
2952        }
2953
2954        // This will not overflow because either `cnt == 0` or the sum is not
2955        // greater than `len`.
2956        self.set_position(pos + cnt as u64);
2957    }
2958}
2959
2960// The existence of this function makes the compiler catch if the Buf
2961// trait is "object-safe" or not.
2962fn _assert_trait_object(_b: &dyn Buf) {}