0037-Bytes-bytes源码阅读
源码 阅读 bytes
2023-09-27 14:23:45 时间
环境
- Time 2022-05-28
- Rust 1.61.0
- Bytes 1.1.0
前言
说明
参考:https://github.com/tokio-rs/bytes
目标
实现 bytes.rs
中的一部分方法。
Deref
通过实现 Deref
来实现自动解引用,解引用成字节切片。
impl Deref for Bytes {
type Target = [u8];
fn deref(&self) -> &[u8] {
self.as_slice()
}
}
AsRef
通过实现 AsRef
,实现了引用到引用的转换。
impl AsRef<[u8]> for Bytes {
fn as_ref(&self) -> &[u8] {
self.as_slice()
}
}
Deref 使用
fn main() {
let bytes = Bytes::from_static("JiangBo".as_bytes());
println!("bytes: {:?}", &bytes[0..5])
}
slice_ref
pub fn slice_ref(&self, subset: &[u8]) -> Bytes {
if subset.is_empty() {
return Bytes::new();
}
let bytes_p = self.as_ptr() as usize;
let bytes_len = self.len();
let sub_p = subset.as_ptr() as usize;
let sub_len = subset.len();
// 子切片的地址大于等于父切片的地址
assert!(
sub_p >= bytes_p,
"subset pointer ({:p}) is smaller than self pointer ({:p})",
sub_p as *const u8,
bytes_p as *const u8,
);
assert!(
sub_p + sub_len <= bytes_p + bytes_len,
"subset is out of bounds: self = ({:p}, {}), subset = ({:p}, {})",
bytes_p as *const u8,
bytes_len,
sub_p as *const u8,
sub_len,
);
// 起地址
let sub_offset = sub_p - bytes_p;
self.slice(sub_offset..(sub_offset + sub_len))
}
slice_ref 使用
fn main() {
let bytes = Bytes::from_static("JiangBo".as_bytes());
println!("bytes: {:p}", bytes.as_ptr());
let sub = bytes.slice_ref(&bytes[5..7]);
println!("bytes: {:p}", sub.as_ptr())
}
with_vtable
直接从给定的 vtable
来创建 Bytes
。
pub(crate) unsafe fn with_vtable(
ptr: *const u8,
len: usize,
data: AtomicPtr<()>,
vtable: &'static Vtable,
) -> Bytes {
Bytes {ptr,len, data, vtable,}
}
inc_start
将指向开始的指针往后移动。
unsafe fn inc_start(&mut self, by: usize) {
debug_assert!(self.len >= by, "internal: inc_start out of bounds");
self.len -= by;
self.ptr = self.ptr.offset(by as isize);
}
总结
给 Bytes
实现了 Deref
,AsRef
,slice_ref
等方法。
附录
相关文章
- seata 源码解析(图解_秒懂_史上最全)
- JDK1.8 ConcurrentHashMap源码阅读
- 《Ceph源码分析》——第1章,第4节Ceph客户端接口
- 写时复制集合 —— CopyOnWriteArrayList 源码原理阅读笔记
- 优秀Android源码阅读资源分享,教你get正确的阅读姿势
- k8s源码分析9-检查k8s集群准入配置和其他准备工作
- k8s源码分析1-阅读源码准备工作
- jQuery1.4源码解读
- SwiftUI 文本组件之文本智能扩展收缩控件(教程含源码)
- SwiftUI 生物文件解析和预览组件支持pdb cif fasta格式 SceneKit(教程含源码)
- SwiftUI 新属性InlinePickerStyle 教程含源码
- Python 代码库之如何获取数据array最后一个元素(含demo源码)
- SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门
- SwiftUI Widget小组件之如何让组件顶对齐 (教程含源码)
- freeswitch源码阅读 之 sofia模块
- openlayers4 入门开发系列之地图属性查询篇(附源码下载)
- springboot+vue外卖点餐系统(源码+文档)
- [置顶] [Android源码分析]inquiry result引起的上层变化分析
- Hadoop源码分析(MapReduce概论)
- elasticSearch6源码分析(8)RepositoriesModule模块
- LeNet5—论文及源码阅读
- 源码阅读(3):Java中主要的List结构——ArrayList集合(上)
- linux下使用vim快速阅读源码
- 四.jQuery源码解析之jQuery.fn.init()的参数解析