【源码阅读】Rust bytes库源码阅读笔记

源码结构

│  bytes.rs
│  bytes_mut.rs
│  lib.rs
│  loom.rs
│  serde.rs
│
├─buf
│      buf_impl.rs
│      buf_mut.rs
│      chain.rs
│      iter.rs
│      limit.rs
│      mod.rs
│      reader.rs
│      take.rs
│      uninit_slice.rs
│      vec_deque.rs
│      writer.rs
│
└─fmt
        debug.rs
        hex.rs
        mod.rs

Trait

1. Buf

必须实现的方法

fn remaining(&self) -> usize
fn chunk(&self) -> &[u8]
fn advance(&mut self, cnt: usize)

另一些实现了该trait的结构体

  • &[u8]
  • &mut T
  • Box
  • Cursor
  • VecDeque

2. BufMut (unsafe)

必须实现的方法

unsafe fn advance_mut(&mut self, cnt: usize)
fn chunk_mut(&mut self) -> &mut UninitSlice
fn remaining_mut(&self) -> usize

Structs

Bytes

结构

/// ```text
///
///    Arc ptrs                   +---------+
///    ________________________ / | Bytes 2 |
///   /                           +---------+
///  /          +-----------+     |         |
/// |_________/ |  Bytes 1  |     |         |
/// |           +-----------+     |         |
/// |           |           | ___/ data     | tail
/// |      data |      tail |/              |
/// v           v           v               v
/// +-----+---------------------------------+-----+
/// | Arc |     |           |               |     |
/// +-----+---------------------------------+-----+
/// ```
pub struct Bytes {
    ptr: *const u8,
    len: usize,
    // inlined "trait object"
    data: AtomicPtr<()>,
    vtable: &'static Vtable,
}

pub(crate) struct Vtable {
    /// fn(data, ptr, len)
    pub clone: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> Bytes,
    /// fn(data, ptr, len)
    pub drop: unsafe fn(&mut AtomicPtr<()>, *const u8, usize),
}
  • ptr : 指针
  • len : 长度

以上两个参数模拟了一个切片,指向内存中的一片连续地址。

  • 使用AtomicPtr和自定义的Vtable模拟trait object的行为。
  • Vtable给Bytes提供动态clone()和drop()

实现trait

  1. 自定义trait
    1. Buf
  2. 标准trait
    1. AsRef
    2. Borrow
    3. Clone
    4. Debug
    5. Default
    6. Deref
    7. Drop
    8. Eq
    9. From
    10. FromIterator
    11. Hash
    12. IntoIterator
    13. LowerHex
    14. Ord
    15. PartialEq
    16. PartialOrd
    17. Send
    18. Sync
    19. UpperHex

重点场景源码学习

Bytes的Drop和Clone实现

源代码

impl Drop for Bytes {
    #[inline]
    fn drop(&mut self) {
        unsafe { (self.vtable.drop)(&mut self.data, self.ptr, self.len) }
    }
}

impl Clone for Bytes {
    #[inline]
    fn clone(&self) -> Bytes {
        unsafe { (self.vtable.clone)(&self.data, self.ptr, self.len) }
    }
}

可见Bytes的Drop和Clone都是由vtable的实现执行的。

VTable实现

Bytes实现了4种VTable

  1. STATIC_VTABLE
  2. PROMOTABLE_EVEN_VTABLE
  3. PROMOTABLE_ODD_VTABLE
  4. SHARED_VTABLE

实现Clone和Drop的思路

请添加图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好,我可以帮助您编写基于 Rust 语言的双均线交易策略的源码。 首先,我们需要引入一些必要的 crate。在 Rust 中,crate 是指可以被编译成的源代码文件的集合。 ```rust extern crate serde; extern crate serde_json; extern crate chrono; extern crate hyper; extern crate hyper_tls; extern crate futures; use std::env; use std::error::Error; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use hyper::{Client, Request, Body}; use hyper_tls::HttpsConnector; use futures::{StreamExt, TryStreamExt}; ``` 然后,我们可以定义一个函数来获取当前交易所的行情数据。这里我们使用 HTTPS 连接来请求数据。 ```rust fn get_exchange_rates(symbol: &str, start_time: DateTime<Utc>, end_time: DateTime<Utc>) -> Result<Vec<ExchangeRate>, Box<dyn Error>> { let api_key = env::var("API_KEY")?; let client = Client::builder().build(HttpsConnector::new()); let url = format!("https://api.exchange.com/v1/candles?symbol={}&start_time={}&end_time={}&api_key={}", symbol, start_time.to_rfc3339(), end_time.to_rfc3339(), api_key); let request = Request::get(url).body(Body::empty())?; let response = client.request(request).await?; let body = response.into_body().try_concat().await?; let rates: Vec<ExchangeRate> = serde_json::from_slice(&body)?; Ok(rates) } ``` 接着,我们可以定义一个函数来计算双均线交易策略的买卖信号。 ```rust fn calculate_signals(rates: &[ExchangeRate]) -> Vec<Signal> { let mut signals = Vec::new(); let mut short_avg = 0.0; let mut long_avg = 0.0; let mut short_total = 0.0; let mut long_total = 0.0

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值