#specialization #cast #specialize #object

no-std castaway

有限编译时间特殊化的安全、零成本的向下转换

7 个版本

0.2.3 2024 年 7 月 4 日
0.2.2 2022 年 6 月 4 日
0.2.1 2022 年 4 月 22 日
0.1.2 2021 年 12 月 9 日
0.1.0 2021 年 6 月 21 日

#64 in Rust 模式

Download history 186397/week @ 2024-05-04 222079/week @ 2024-05-11 209516/week @ 2024-05-18 223371/week @ 2024-05-25 298735/week @ 2024-06-01 288072/week @ 2024-06-08 288489/week @ 2024-06-15 313132/week @ 2024-06-22 291564/week @ 2024-06-29 294424/week @ 2024-07-06 313944/week @ 2024-07-13 336969/week @ 2024-07-20 327059/week @ 2024-07-27 326153/week @ 2024-08-03 343942/week @ 2024-08-10 298114/week @ 2024-08-17

1,357,815 每月下载量
用于 972 个 crate (11 直接)

MIT 许可证

38KB
494 代码行

Castaway

有限编译时间特殊化的安全、零成本的向下转换。

Crates.io Documentation License Minimum supported Rust version Build

文档

请查看文档以获取如何使用 Castaway 及其限制的详细信息。为了帮助您入门,这里有一个 Castaway 的简单示例

use std::fmt::Display;
use castaway::cast;

/// Like `std::string::ToString`, but with an optimization when `Self` is
/// already a `String`.
///
/// Since the standard library is allowed to use unstable features,
/// `ToString` already has this optimization using the `specialization`
/// feature, but this isn't something normal crates can do.
pub trait FastToString {
    fn fast_to_string(&self) -> String;
}

impl<T: Display> FastToString for T {
    fn fast_to_string(&self) -> String {
        // If `T` is already a string, then take a different code path.
        // After monomorphization, this check will be completely optimized
        // away.
        if let Ok(string) = cast!(self, &String) {
            // Don't invoke the std::fmt machinery, just clone the string.
            string.to_owned()
        } else {
            // Make use of `Display` for any other `T`.
            format!("{}", self)
        }
    }
}

fn main() {
    println!("specialized: {}", String::from("hello").fast_to_string());
    println!("default: {}", "hello".fast_to_string());
}

最低支持的 Rust 版本

Castaway 最低支持的 Rust 版本(或 MSRV)为 稳定版 Rust 1.38 或更高,这意味着我们只保证如果使用至少 1.38 版本的 rustc,Castaway 可以编译。这个版本在 CI 中明确测试过,并且只能在新小版本中升级。任何对支持的最低版本的改变都将在发行说明中列出。

这是什么?

这是一个实验性库,它实现了在稳定 Rust 上工作的零成本向下转换类型。它始于我对这个拉取请求的阅读后的一次思想实验,并想知道是否可以在不使用特质对象的情况下根据具体类型改变泛型函数的行为。我在尝试不同实现并检查示例程序的生成汇编代码时意外地发现了我的发现的“零成本”特性。

API 与标准库中的 Any 部分类似,但 Castaway 专注于编译时向下转换而不是运行时向下转换。与 Any 不同,Castaway 在有限场景下支持安全地将非 'static 引用转换为类型。如果你需要存储一个或多个实现某些特质并具有向下转换选项的 Box<?> 对象,那么使用 Any 会更好。

许可证

本项目源代码和文档使用 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。

依赖项