0038-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
中的一部分方法。
split_off
在中间进行切割,分成两半。
pub fn split_off(&mut self, at: usize) -> Bytes {
// 分割的长度必须小于等于Bytes的长度
assert!(
at <= self.len(),
"split_off out of bounds: {:?} <= {:?}",
at,
self.len(),
);
// 如果从最后一位切割,相当于被切的不变,返回一个空的Bytes
if at == self.len() {
return Bytes::new();
}
// 如果从头开始切换,相当于被切的变成了空,返回被切的Bytes
if at == 0 {
return mem::replace(self, Bytes::new());
}
// 复制不会底层字节,只会复制四个usize的长度
let mut ret = self.clone();
// 被切割了,所以长度变短了
self.len = at;
// 把指向开头的指针移动到被切割的位置,并且变更长度
unsafe { ret.inc_start(at) };
ret
}
split_to
split_off
是把后面的切割下来,前面的保留,而 split_to
相反。
pub fn split_to(&mut self, at: usize) -> Bytes {
assert!(
at <= self.len(),
"split_to out of bounds: {:?} <= {:?}",
at,
self.len(),
);
if at == self.len() {
return mem::replace(self, Bytes::new());
}
if at == 0 {
return Bytes::new();
}
let mut ret = self.clone();
unsafe { self.inc_start(at) };
ret.len = at;
ret
}
Default
impl Default for Bytes {
fn default() -> Bytes {
Bytes::new()
}
}
Default 使用
fn main() {
let _ = Bytes::default();
}
from
impl From<&'static [u8]> for Bytes {
fn from(slice: &'static [u8]) -> Bytes {
Bytes::from_static(slice)
}
}
impl From<&'static str> for Bytes {
fn from(slice: &'static str) -> Bytes {
Bytes::from_static(slice.as_bytes())
}
}
from 使用
fn main() {
let _: Bytes = "Hello, world!".into();
let _: Bytes = b"Hello, world!".as_slice().into();
}
总结
给 Bytes
实现了 split_off
,split_to
,from
等方法。
附录
相关文章
- 《Python 源码阅读》之 类型Type
- 高校就业数据可视化管理系统的设计与实现(论文+源码)_kaic
- 怎么样阅读tomcat源码
- 基于Java实现农产品交易平台的设计与实现(论文+源码)_kaic
- [数据结构与算法]RED-BLACK(红黑)树的实现TreeMap源码阅读
- Bert源码阅读
- 0046-Bytes-bytes源码阅读
- 0044-Bytes-bytes源码阅读
- 0034-Bytes-bytes源码阅读
- 2023-02-07 ORCA 源码阅读 Overview
- Collection源码阅读
- java常用类介绍及源码阅读(ArrayList)
- Github域名加上1s,在线VS Code阅读源码神器诞生
- Seata AT 模式启动源码分析
- WebRTC系列 -- iOS ADM音频数据流处理流程及源码阅读记录
- 开发者必备的6款源码搜索引擎
- 阅读源码
- 认真阅读完这篇文章熟练掌握JAVA关于反射——案例源码详解
- Flask 源码阅读笔记 开篇
- 阅读Android源码 MeasureSpec类(API版本:23)
- libevent源码分析:bufferevent
- Vue2.0源码阅读笔记--双向绑定实现原理
- webpack原理篇(五十二):webpack-cli源码阅读
- Flutter框架层启动源码剖析
- react16 源码阅读学习记录
- keystone系列五:keystone源码分析
- Redux 学习笔记 - 源码阅读
- 面试还问redux?那我从头手撸源码吧(核心代码)
- 我的源码阅读之路:redux源码剖析(下)