Структура ReadBuf
pub struct ReadBuf<'a> { /* private fields */ }
Обёртка над буфером байтов, который постепенно заполняется и инициализируется.
Этот тип можно представить как «двойной курсор». Он отслеживает три области буфера: область в начале буфера, логически заполненную данными; область, которая была инициализирована, но ещё не заполнена логически; и область в конце, которая может быть неинициализированной. Гарантируется, что заполненная область является подмножеством инициализированной области.
Содержимое буфера можно представить следующим образом:
[ capacity ]
[ filled | unfilled ]
[ initialized | uninitialized ]Деинициализация любых байтов из неинициализированной области приводит к неопределённому поведению, поскольку неизвестно, является ли эта область неинициализированной, и если окажется, что какая-либо её часть инициализирована, она должна остаться инициализированной.
Реализации
impl<'a> ReadBuf<'a>
pub fn new(buf: &'a mut [u8]) -> ReadBuf<'a>
Создает новый ReadBuf из полностью инициализированного буфера.
pub fn uninit(buf: &'a mut [MaybeUninit<u8>]) -> ReadBuf<'a>
Создает новый ReadBuf из буфера, который может быть неинициализирован.
Внутренний курсор пометит весь буфер как неинициализированный. Если известно, что часть буфера уже инициализирована, используйте assume_init для перемещения внутреннего курсора.
pub fn filled_mut(&mut self) -> &mut [u8] ⓘ
Возвращает изменяемую ссылку на заполненную часть буфера.
pub fn take(&mut self, n: usize) -> ReadBuf<'_>
Возвращает новый ReadBuf, состоящий из незаполненной части длиной до n.
pub fn initialized(&self) -> &[u8] ⓘ
Возвращает общую ссылку на инициализированную часть буфера.
Она включает заполненную часть.
pub fn initialized_mut(&mut self) -> &mut [u8] ⓘ
Возвращает изменяемую ссылку на инициализированную часть буфера.
Она включает заполненную часть.
pub unsafe fn inner_mut(&mut self) -> &mut [MaybeUninit<u8>]
Возвращает изменяемую ссылку на весь буфер, не гарантируя, что он полностью инициализирован.
Элементы от 0 до self.filled().len() заполнены, а элементы от 0 до self.initialized().len() инициализированы (и поэтому могут быть преобразованы в &mut [u8]).
Вызывающий этот метод должен обеспечить соблюдение этих инвариантов. Например, если вызывающий инициализирует часть неинициализированного участка буфера, он должен вызвать assume_init, указав количество инициализированных байтов.
Безопасность
Вызывающий не должен деинициализировать уже инициализированные части буфера. Это включает любые байты в области, помеченной как неинициализированная с помощью ReadBuf.
pub unsafe fn unfilled_mut(&mut self) -> &mut [MaybeUninit<u8>]
Возвращает изменяемую ссылку на незаполненную часть буфера, не гарантируя, что она полностью инициализирована.
Безопасность
Вызывающий не должен деинициализировать уже инициализированные части буфера. Это включает любые байты в области, помеченной как неинициализированная с помощью ReadBuf.
pub fn initialize_unfilled(&mut self) -> &mut [u8] ⓘ
Возвращает изменяемую ссылку на незаполненную часть буфера, гарантируя ее полную инициализацию.
Поскольку ReadBuf отслеживает область буфера, которая была инициализирована, после первого использования эта операция фактически становится «бесплатной».
pub fn initialize_unfilled_to(&mut self, n: usize) -> &mut [u8] ⓘ
Возвращает изменяемую ссылку на первые n байт незаполненной части буфера, обеспечивая их полную инициализацию.
Паника
Вызывает панику, если self.remaining() меньше n.
pub fn remaining(&self) -> usize
Возвращает количество байт в конце среза, которые ещё не заполнены.
pub fn clear(&mut self)
Очищает буфер, сбрасывая заполненную область до пустого состояния.
Количество инициализированных байт не изменяется, а содержимое буфера не модифицируется.
pub fn advance(&mut self, n: usize)
Увеличивает размер заполненной области буфера.
Количество инициализированных байт не изменяется.
Паника
Вызывает панику, если заполненная область буфера станет больше инициализированной области.
pub fn set_filled(&mut self, n: usize)
Задаёт размер заполненной области буфера.
Количество инициализированных байт не изменяется.
Обратите внимание, что этот метод можно использовать не только для увеличения, но и для уменьшения заполненной области буфера (например, в реализации AsyncRead, сжимающей данные на месте).
Паника
Вызывает панику, если заполненная область буфера станет больше инициализированной области.
pub unsafe fn assume_init(&mut self, n: usize)
Утверждает, что первые n незаполненных байт буфера инициализированы.
ReadBuf предполагает, что байты никогда не деинициализируются, поэтому этот метод ничего не делает, если вызывается с меньшим количеством байт, чем уже известно как инициализированное.
Безопасность
Вызывающий код должен обеспечить, чтобы n незаполненных байт буфера уже были инициализированы.
Реализации трейтов
fn remaining_mut(&self) -> usize
unsafe fn advance_mut(&mut self, cnt: usize)
fn chunk_mut(&mut self) -> &mut UninitSlice
BufMut::remaining_mut(). Обратите внимание, что он может быть короче всего оставшегося пространства буфера (это позволяет реализовывать буфер без непрерывной области памяти). Подробнее
fn has_remaining_mut(&self) -> bool
self есть место для дополнительных байтов. Подробнее
fn put<T>(&mut self, src: T)
fn put_u16_le(&mut self, n: u16)
self в порядке байтов от младшего к старшему. Подробнее
fn put_u16_ne(&mut self, n: u16)
self в порядке байтов, принятом в целевой архитектуре. Подробнее
fn put_i16(&mut self, n: i16)
self в порядке байтов от старшего к младшему. Подробнее
fn put_i16_le(&mut self, n: i16)
self в порядке байтов от младшего к старшему. Подробнее
fn put_i16_ne(&mut self, n: i16)
self в порядке байтов, принятом в целевой архитектуре. Подробнее
fn put_u32(&mut self, n: u32)
self в порядке байтов от старшего к младшему. Подробнее
fn put_u32_le(&mut self, n: u32)
self в порядке байтов от младшего к старшему. Подробнее
fn put_u32_ne(&mut self, n: u32)
self в порядке байтов, принятом в целевой архитектуре. Подробнее
fn put_i32(&mut self, n: i32)
self в порядке байтов от старшего к младшему. Подробнее
fn put_i32_le(&mut self, n: i32)
self в порядке байтов от младшего к старшему. Подробнее
fn put_i32_ne(&mut self, n: i32)
self в порядке байтов, принятом в целевой архитектуре. Подробнее
fn put_u64(&mut self, n: u64)
self в порядке байтов от старшего к младшему. Подробнее
fn put_u64_le(&mut self, n: u64)
self в порядке байтов от младшего к старшему. Подробнее
fn put_u64_ne(&mut self, n: u64)
self в нативном порядке байтов. Подробнее
fn put_i64(&mut self, n: i64)
self в порядке байтов от старшего к младшему. Подробнее
fn put_i64_le(&mut self, n: i64)
self в порядке байтов от младшего к старшему. Подробнее
fn put_i64_ne(&mut self, n: i64)
self в нативном порядке байтов. Подробнее
fn put_u128(&mut self, n: u128)
self в порядке байтов от старшего к младшему. Подробнее
fn put_u128_le(&mut self, n: u128)
self в порядке байтов от младшего к старшему. Подробнее
fn put_u128_ne(&mut self, n: u128)
self в нативном порядке байтов. Подробнее
fn put_i128(&mut self, n: i128)
self в порядке байтов от старшего к младшему. Подробнее
fn put_i128_le(&mut self, n: i128)
self в порядке байтов от младшего к старшему. Подробнее
fn put_i128_ne(&mut self, n: i128)
self в порядке байтов, соответствующем порядку байтов платформы. Подробнее
fn put_uint(&mut self, n: u64, nbytes: usize)
self в порядке байтов от старшего к младшему. Подробнее
fn put_uint_le(&mut self, n: u64, nbytes: usize)
self в порядке байтов от младшего к старшему. Подробнее
fn put_uint_ne(&mut self, n: u64, nbytes: usize)
self в порядке байтов, соответствующем порядку байтов платформы. Подробнее
fn put_int(&mut self, n: i64, nbytes: usize)
nbytes знакового целого числа в self в порядке байтов от старшего к младшему. Подробнее
fn put_int_le(&mut self, n: i64, nbytes: usize)
nbytes знакового целого числа в self в порядке байтов от младшего к старшему. Подробнее
fn put_int_ne(&mut self, n: i64, nbytes: usize)
nbytes знакового целого числа в self в порядке байтов, соответствующем порядку байтов платформы. Подробнее
fn put_f32(&mut self, n: f32)
self в порядке байтов от старшего к младшему. Подробнее
fn put_f32_le(&mut self, n: f32)
self в порядке байтов от младшего к старшему. Подробнее
fn put_f32_ne(&mut self, n: f32)
self в порядке байтов, соответствующем порядку байтов платформы. Подробнее
fn put_f64(&mut self, n: f64)
self в порядке байтов от старшего к младшему. Подробнее
fn put_f64_le(&mut self, n: f64)
self в порядке байтов от младшего к старшему. Подробнее
fn put_f64_ne(&mut self, n: f64)
self в порядке байтов, принятом в данной системе. Подробнее
Реализации автоматических трейтов
impl<'a> !UnwindSafe for ReadBuf<'a>
impl<'a> Freeze for ReadBuf<'a>
impl<'a> RefUnwindSafe for ReadBuf<'a>
impl<'a> Send for ReadBuf<'a>
impl<'a> Sync for ReadBuf<'a>
impl<'a> Unpin for ReadBuf<'a>
impl<'a> UnsafeUnpin for ReadBuf<'a>
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/struct.ReadBuf.html