0044-Bytes-bytes源码阅读

环境

  • Time 2022-05-29
  • Rust 1.61.0
  • Bytes 1.1.0

前言

说明

参考:https://github.com/tokio-rs/bytes

目标

Buf 是一个 trait,里面有几个方法需要实现,Bytes 实现了 Buf

remaining

fn remaining(&self) -> usize {
    self.len()
}

chunk

fn chunk(&self) -> &[u8] {
    self.as_slice()
}

advance

fn advance(&mut self, cnt: usize) {
    assert!(
        cnt <= self.len(),
        "cannot advance past `remaining`: {:?} <= {:?}",
        cnt,
        self.len(),
    );

    unsafe {
        self.inc_start(cnt);
    }
}

copy_to_bytes

fn copy_to_bytes(&mut self, len: usize) -> crate::Bytes {
    if len == self.remaining() {
        core::mem::replace(self, Bytes::new())
    } else {
        let ret = self.slice(..len);
        self.advance(len);
        ret
    }
}

truncate

还有之前没有实现的几个方法。

pub fn truncate(&mut self, len: usize) {
    if len < self.len {
        if self.vtable as *const Vtable == &PROMOTABLE_EVEN_VTABLE
            || self.vtable as *const Vtable == &PROMOTABLE_ODD_VTABLE
        {
            drop(self.split_off(len));
        } else {
            self.len = len;
        }
    }
}

clear

pub fn clear(&mut self) {
    self.truncate(0);
}

总结

Bytes 实现了 Buf,补上了之前未实现的方法。

附录

posted @   jiangbo4444  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-09-30 【JavaScript】展开语法
2020-09-30 【JavaScript】剩余参数
2020-09-30 【JavaScript】默认参数
2020-09-30 【JavaScript】import
2020-09-30 【JavaScript】debugger
2020-09-30 【JavaScript】for await...of
点击右上角即可分享
微信分享提示