#cpp #string #set #map #std

sys hicc-std

Based on hicc's ability to provide rust with the ability to call c++ standard container class interfaces

1 unstable release

new 0.1.0 May 6, 2025

#672 in Algorithms

MIT/Apache

240KB
3K SLoC

hicc-std

基于hiccc++标准库中的容器类提供安全的rust api.

支持c++标准库的全部容器类型:

  1. std::basic_string<charT> (hicc/std/string.hpp)
  2. std::vector<T>(hicc/std/vector.hpp)
  3. std::vector<bool>(hicc/std/vector.hpp)
  4. std::deque<T>(hicc/std/deque.hpp)
  5. std::set<T>(hicc/std/set.hpp)
  6. std::multiset<T>(hicc/std/set.hpp)
  7. std::unordered_set<T>(hicc/std/unordered_set.hpp)
  8. std::unordered_multiset<T>(hicc/std/unordered_set.hpp)
  9. std::map<T>(hicc/std/map.hpp)
  10. std::multimap<T>(hicc/std/map.hpp)
  11. std::unordered_map<T>(hicc/std/unordered_map.hpp)
  12. std::unordered_multimap<T>(hicc/std/unordered_map.hpp)
  13. std::array<T>(hicc/std/array.hpp)
  14. std::list<T>(hicc/std/list.hpp)
  15. std::forward_list<T>(hicc/std/forward_list.hpp)
  16. std::queue<T>(hicc/std/queue.hpp)
  17. std::priority_queue<T>(hicc/std/queue.hpp)
  18. std::stack<T>(hicc/std/stack.hpp)

使用方式

因为都是模板类,需要使用者遵循hicc二次开发指南实例化具体类型. 简要说明如下:

  1. 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>.

  1. 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;
}

注意:

  1. 模版参数类型只能是c++类或者可直接在CABI接口上传递使用的POD数据类型,后者只能结合hicc::Pod<T>使用.
  2. 需要用class <ident= <实例化模板类>重定义类型名后使用.
  1. 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++标准库.

迭代器接口说明

  1. 利用rust生命周期机制管理容器和迭代器的资源, 增强了内存安全性.
pub struct VecBool {
   fn iter(&self) -> impl Iterator<Item = bool> + '_ {
       //...
   }
}
  1. 因为1)导致基于迭代器的增删接口和rust借用规则冲突,对应功能接口无法保持和c++ api完全相同.

hicc-std预定义创建接口

只定义了string/u16string/u32string的创建接口. 其他容器实例化类型的创建接口需要使用者按需定义.

doc test需要开启test feature:

# cargo test --features "test"

Dependencies

~0.2–1MB
~21K SLoC