1 unstable release
new 0.1.0 | May 6, 2025 |
---|
#672 in Algorithms
240KB
3K
SLoC
hicc-std
基于hicc
为c++
标准库中的容器类提供安全的rust api
.
支持c++
标准库的全部容器类型:
std::basic_string<charT>
(hicc/std/string.hpp
)std::vector<T>
(hicc/std/vector.hpp
)std::vector<bool>
(hicc/std/vector.hpp
)std::deque<T>
(hicc/std/deque.hpp
)std::set<T>
(hicc/std/set.hpp
)std::multiset<T>
(hicc/std/set.hpp
)std::unordered_set<T>
(hicc/std/unordered_set.hpp
)std::unordered_multiset<T>
(hicc/std/unordered_set.hpp
)std::map<T>
(hicc/std/map.hpp
)std::multimap<T>
(hicc/std/map.hpp
)std::unordered_map<T>
(hicc/std/unordered_map.hpp
)std::unordered_multimap<T>
(hicc/std/unordered_map.hpp
)std::array<T>
(hicc/std/array.hpp
)std::list<T>
(hicc/std/list.hpp
)std::forward_list<T>
(hicc/std/forward_list.hpp
)std::queue<T>
(hicc/std/queue.hpp
)std::priority_queue<T>
(hicc/std/queue.hpp
)std::stack<T>
(hicc/std/stack.hpp
)
使用方式
因为都是模板类,需要使用者遵循hicc
二次开发指南实例化具体类型. 简要说明如下:
c++
适配代码.
// src/my_lib.cpp
#include <hicc/std/vector.hpp>
EXPORT_METHODS_BEG(my_lib) {
EXPORT_METHOD(&hicc::make_unique<std::vector<std::map<int, std::string>>>);
}EXPORT_METHODS_END();
注意: 不依赖任何缺省的模版参数. 比如可以支持std::vector<int, MyAllocator>
.
rust api
定义.
struct MyContainer;
hicc::import_lib! {
/// 和`c++`侧`EXPORT_METHODS_BEG`宏的参数保持一致.
#[link_name = "my_lib"]
/// `class`关键字声明了这是一个`c++`类类型.
pub class VecMapIntString = hicc::vector<hicc::map<hicc::Pod<i32>, hicc::string>>;
/// 建议关联到`MyContainer::new`, 直接调用`vec_map_int_string_new`也可以.
#[member(class = MyContainer, method = new)]
fn vec_map_int_string_new() -> VecMapIntString;
}
fn main() {
let container = MyContainer::new();
//...
}
hicc::import_lib! {
// 和`c++`侧`EXPORT_METHODS_BEG`宏的参数保持一致.
#[link_name = "my_lib"]
/// `class`关键字声明了这是一个`c++`类类型.
pub class VecMapIntString = hicc::vector<hicc::map<hicc::Pod<i32>, hicc::string>>;
fn vec_map_int_string_new() -> VecMapIntString;
}
注意:
- 模版参数类型只能是
c++
类或者可直接在CABI
接口上传递使用的POD
数据类型,后者只能结合hicc::Pod<T>
使用.- 需要用
class <ident= <实例化模板类>
重定义类型名后使用.
build.rs
编译c++
代码
hicc_build::Build::new().file("src/my_lib.cpp").compile("my_lib");
println!("cargo::rustc-link-lib=my_lib");
println!("cargo::rustc-link-lib=stdc++");
hicc_build
仅支持生成静态块, 需要最终构建为可执行程序或者动态库时指定所依赖的c++
标准库.
迭代器接口说明
- 利用
rust
生命周期机制管理容器和迭代器的资源, 增强了内存安全性.
pub struct VecBool {
fn iter(&self) -> impl Iterator<Item = bool> + '_ {
//...
}
}
- 因为1)导致基于迭代器的增删接口和
rust
借用规则冲突,对应功能接口无法保持和c++ api
完全相同.
hicc-std
预定义创建接口
只定义了string/u16string/u32string
的创建接口. 其他容器实例化类型的创建接口需要使用者按需定义.
doc test
需要开启test feature
:
# cargo test --features "test"
Dependencies
~0.2–1MB
~21K SLoC