4个版本 (1个稳定版)

1.0.0 2023年8月21日
0.3.0 2023年7月21日
0.2.0 2023年6月20日
0.1.0 2023年5月3日

#509 in 过程宏

Download history 23/week @ 2024-07-06 92/week @ 2024-07-27

每月115次下载

MIT许可证

16KB
223

cpy-rs 🦀🛠️🐍

Test all targets crates.io docs.rs

cpy-rs 是一个Rust库,它有助于从Rust到C++和Python创建绑定。它提供了一组宏,可以轻松地将Rust结构、枚举和函数导出到C/C++和Python。

功能

  • cpy_enum:用于导出枚举。
  • cpy_struct:用于导出结构。
  • cpy_fn:用于导出C++和Python的功能。
  • cpy_fn_c:用于导出专用的C++功能。
  • cpy_fn_py:用于导出专用的Python功能。
  • cpy_module:用于导出Python模块。

注意:建议在使用 cpy_fn_ccpy_fn_py 时在函数签名末尾使用 _c_py 后缀。当在C++和Python中使用这些函数时,宏将删除后缀。后缀也不需要在 cpy_module 内使用。以下示例可作为指南。

示例用法

仓库包含一个示例项目,演示了如何使用 cpy-rs 创建绑定。

  • 在此处查看基于Python的代码示例。
  • 在此处查看基于CMake/C++的示例。

代码使用

use cpy_binder::{cpy_enum, cpy_fn, cpy_fn_c, cpy_fn_py, cpy_module, cpy_struct};

#[cpy_enum]
#[comment = "Material types"]
enum Material {
    Plastic,
    Rubber,
}

#[cpy_struct]
#[comment = "2D Size"]
struct Size2D {
    width: f64,
    height: f64,
}

#[cpy_struct]
#[comment = "Tire structure"]
struct Tire {
    material: Material,
    pressure: f64,
    size: Size2D,
}


#[cpy_fn]
#[comment_c = "@brief Creates and returns a random tire.\n
    @return Tire A randomly generated tire.\n"]
#[comment_py = "Creates and returns a random tire.\n
    Returns:\n
        Tire: A randomly generated tire.\n"]
fn create_random_tire() -> Tire {
    use rand::Rng;
    let mut rng = rand::thread_rng();

    let random_material = if rng.gen_bool(0.5) {
        Material::Plastic
    } else {
        Material::Rubber
    };

    Tire {
        material: random_material,
        pressure: rng.gen_range(30.0..60.0),
        size: Size2D {
            width: rng.gen_range(5.0..10.0),
            height: rng.gen_range(10.0..20.0),
        },
    }
}

#[cpy_fn_c]
#[comment = "Function for C ABI"]
fn format_wheel_identifier_c(dimensions: &[u8; 3]) {
    println!("Wheel identifier: {:?}", dimensions);
}

#[cpy_fn_py]
#[comment = "Format wheel identifier for Python"]
fn format_wheel_identifier_py(dimensions: [u8; 3]) {
    println!("Wheel identifier: {:?}", dimensions);
}


// Used to export Python module
cpy_module!(
    name = example,
    types = [Material, Size2D, Tire],
    functions = [
        create_random_tire,
        format_wheel_identifier,
    ]
);

依赖项

~1.2–7MB
~47K SLoC