#smart-pointers #refcell #rc #borrow #shared #sync #arc

nightly speedy_refs

一组简单、快速且实用的智能指针

9次发布

0.2.7 2023年4月30日
0.2.6 2023年4月21日
0.1.0 2023年4月5日

396内存管理

Download history 5/week @ 2024-03-27 1/week @ 2024-04-03

每月下载量 55

MIT 许可证 MIT

47KB
707

SPEEDY_REFS

Rust的简单、快速且实用的智能指针集合。

特性

  • Rc -> 对 std Rc 智能指针的闪电般快速的替代品。
  • RefCell -> 对 std RefCell 的闪电般快速的替代品。
  • Arc - 性能相当,但更轻量级的 std Arc 替代品
  • HeapCell - 类似于 NonNull,具有更简单的类型 deallocationdropping
  • Reon - 实现了 SyncSend 的只读静态指针
  • RcCell - Rc<RefCell> 的简单且更简洁的版本
  • SharedCell - 用于无需借用检查的共享所有权。
  • Borrow - 无需借用检查的可克隆共享所有权。类似于在Java、Go、Python等语言中使用引用的方式。

即将推出

  • Atomic - 使用原子操作来控制对任何类型的可变和不可变访问,以进行多线程同步。
  • Hazard - 危险指针实现。

依赖项

安装

[dependencies]
speedy_refs = "0.2.7"

示例

Reon

use std::thread;
use std::sync::{Arc, Barrier};
use speedy_refs::Reon;

fn main() {
    let x = Reon::new(42);
    let num_threads = 4;
    let barrier = Arc::new(Barrier::new(num_threads));

    let mut threads = Vec::with_capacity(num_threads);

    for _ in 0..num_threads {
        let x = x.clone();
        let barrier = Arc::clone(&barrier);
        let thread = thread::spawn(move || {
            barrier.wait();
            println!("Thread {:?} sees value: {}", thread::current().id(), *x);
        });
        threads.push(thread);
    }

    for thread in threads {
        thread.join().unwrap();
    }
}

Borrow

use speedy_refs::Borrow;

#[derive(Debug, PartialEq, Eq)]
struct Data(String, usize, bool, Vec<Self>);

fn main() {
    // Create a new variable
    let data = Data(String::from("Hello, World"), 100, false, vec![]);
    // Create a Borrow (a reference) with the variable
    let mut data_ref = Borrow::new(data);
    // Create another reference to the same variable
    let mut clone = Borrow::clone(&data_ref);
    // Use the Borrow seemlessly
    data_ref.0.push('!');
    clone.1 += 55;
    data_ref.2 = true;
    clone.3.push(Data("".into(), 0, false, Vec::new()));

    // Debug for JavaCell is same as that for Data
    println!("{:?}", clone);
    // Output
    //Data("Hello, World!", 155, true, [Data("", 0, false, [])])
    println!("{:?}", data_ref);
    // Output
    //Data("Hello, World!", 155, true, [Data("", 0, false, [])])

    assert_eq!(
        *data_ref,
        Data(
            String::from("Hello, World!"),
            155,
            true,
            vec![Data("".into(), 0, false, vec![])]
        )
    );
    assert_eq!(
        *clone,
        Data(
            String::from("Hello, World!"),
            155,
            true,
            vec![Data("".into(), 0, false, vec![])]
        )
    );
    // Borrow implements AsRef and Deref of T
    print(&data_ref);
}

fn print<T: std::fmt::Debug>(data: &T) {
    // do something
    println!("{:?}", data);
}

许可证

MIT许可证

依赖项

~0.4–1MB
~23K SLoC