hicc_std/
lib.rs

1//! ## 使用方式
2//! 
3//! 注:
4//! 1. `hicc-std`仅提供了`std::string`, `std::u16string`, `std::u32string`相关的构造函数.
5//! 1. `v0.2.0`版本, 通过增加参数校验,消除了原接口中可能抛出的各种异常.
6//!    部分接口的返回值类型发生了变化.
7//! 
8//! 因为都是模板类,需要使用者显示实现实例化模版类的构建函数. 参见如下代码:
9//! 
10//! ```text
11//! use hicc::AbicClass;
12//! 
13//! hicc::cpp! {
14//!     // c++侧需要引用hicc提供的头文件.
15//!     #include <hicc/std/map.hpp>
16//!     #include <hicc/std/string.hpp>
17//!
18//!     // 按需定义容器类型. 可以包含非缺省的Allocator等模版参数类型.
19//!     typedef std::map<int, std::string> CppMap;
20//! }
21//! 
22//! hicc::import_lib! {
23//!     #![link_name = "example"]
24//! 
25//!     // 对应`c++`的`CppMap`
26//!     class RustMap = hicc_std::map<hicc::Pod<i32>, hicc_std::string>;
27//! 
28//!     // 创建容器接口.
29//!     #[cpp(func = "std::unique_ptr<CppMap> hicc::make_unique<CppMap>()")]
30//!     fn rustmap_new() -> RustMap;
31//! }
32//! 
33//! fn main() {
34//!     let mut map = rustmap_new();
35//!     let name = hicc_std::string::from(c"hello");
36//!     map.insert(&0, &name);
37//!     assert_eq!(map.get(&1), None);
38//!     assert_eq!(map.get(&0), Some(name.as_ref()));
39//! }
40//! ```
41//! 
42//! **注意**: 
43//! > 1. 模版参数类型只能是`c++`类或者可直接在`CABI`接口上传递使用的`POD`数据类型,后者只能结合`hicc::Pod<T>`使用.
44//! 
45//! 3. `build.rs`编译`c++`代码
46//! 
47//! ```text
48//! fn main() {
49//!     hicc_build::Build::new().rust_file("src/main.rs").compile("example");
50//!     println!("cargo::rustc-link-lib=example");
51//!     println!("cargo::rustc-link-lib=stdc++");
52//!     println!("cargo::rerun-if-changed=src/main.rs");
53//! }
54//! ```
55//! 
56//! `hicc_build`仅支持生成静态库, 需要最终构建为可执行程序或者动态库时指定所依赖的`c++`标准库.
57//! 
58//! ## 迭代器接口说明
59//! 
60//! `c++`容器基于迭代器实现插入删除等接口违背`rust`的借用规则, `hicc-std`将迭代器做了二次封装,提供容器遍历和插入删除功能.
61//! 
62//! ## 测试
63//! 
64//! `doc test`需要开启`test feature`, 提供了测试用例用到的容器实例化类型的构建函数.
65//! 
66//! ```text
67//! # cargo test --features "test"
68//! ```
69//!
70mod std_string;
71pub use std_string::*;
72
73mod std_array;
74pub use std_array::*;
75
76mod std_deque;
77pub use std_deque::*;
78
79mod std_vector;
80pub use std_vector::*;
81
82mod std_stack;
83pub use std_stack::*;
84
85mod std_queue;
86pub use std_queue::*;
87
88mod std_list;
89pub use std_list::*;
90
91mod std_forward_list;
92pub use std_forward_list::*;
93
94mod std_set;
95pub use std_set::*;
96
97mod std_unordered_set;
98pub use std_unordered_set::*;
99
100mod std_map;
101pub use std_map::*;
102
103mod std_unordered_map;
104pub use std_unordered_map::*;
105
106hicc::import_lib! {
107    #![link_name = "hicc_std_string"]
108
109    hicc::cpp! {
110        #include <hicc/std/string.hpp>
111    }
112
113    class string;
114
115    #[cpp(func = "std::unique_ptr<std::string> hicc::make_unique<std::string>()")]
116    fn string_new() -> string;
117
118    #[cpp(func = "std::unique_ptr<std::string> hicc::make_unique<std::string, const char*>(const char* &&)")]
119    unsafe fn string_with_cstr(s: *const i8) -> string;
120
121    #[cpp(func = "std::unique_ptr<std::string> hicc::make_unique<std::string, const char*, size_t>(const char* &&, size_t&&)")]
122    unsafe fn string_with_buf(s: *const u8, len: usize) -> string;
123
124    #[cpp(func = "std::unique_ptr<std::u16string> hicc::make_unique<std::u16string>()")]
125    fn u16string_new() -> u16string;
126
127    #[cpp(func = "std::unique_ptr<std::u16string> hicc::make_unique<std::u16string, const char16_t*, size_t>(const char16_t* &&, size_t&&)")]
128    unsafe fn u16string_with_buf(s: *const u16, len: usize) -> u16string;
129
130    #[cpp(func = "std::unique_ptr<std::u32string> hicc::make_unique<std::u32string>()")]
131    fn u32string_new() -> u32string;
132
133    #[cpp(func = "std::unique_ptr<std::u32string> hicc::make_unique<std::u32string, const char32_t*, size_t>(const char32_t* &&, size_t&&)")]
134    unsafe fn u32string_with_buf(s: *const u32, len: usize) -> u32string;
135}
136
137#[cfg(feature = "test")]
138hicc::import_lib! {
139    #![link_name = "hicc_std_test"]
140    hicc::cpp! {
141        #include <hicc/std/array.hpp>
142        #include <hicc/std/deque.hpp>
143        #include <hicc/std/vector.hpp>
144        #include <hicc/std/stack.hpp>
145        #include <hicc/std/queue.hpp>
146        #include <hicc/std/list.hpp>
147        #include <hicc/std/forward_list.hpp>
148        #include <hicc/std/set.hpp>
149        #include <hicc/std/map.hpp>
150        #include <hicc/std/unordered_set.hpp>
151        #include <hicc/std/unordered_map.hpp>
152    }
153    class string;
154
155    /// 对应`std::array<int, N>`. 其中`N`由具体创建函数决定.
156    pub class ArrayInt = array<hicc::Pod<i32>>;
157    /// 对应`std::array<int, 10>`
158    #[cpp(func = "std::unique_ptr<std::array<int, 10>> hicc::make_unique<std::array<int, 10>>()")]
159    #[member(class = ArrayInt, method = new_10)]
160    pub fn array_int_10_new() -> ArrayInt;
161    /// 对应`std::array<std::string, N>`. 其中`N`由具体创建函数决定.
162    pub class ArrayString = array<string>;
163    /// 对应`std::array<std::string, 10>`
164    #[cpp(func = "std::unique_ptr<std::array<std::string, 10>> hicc::make_unique<std::array<std::string, 10>>()")]
165    #[member(class = ArrayString, method = new_10)]
166    pub fn array_string_10_new() -> ArrayString;
167
168
169    
170    /// 对应`std::deque<int>`
171    pub class DequeInt = deque<hicc::Pod<i32>>;
172    #[cpp(func = "std::unique_ptr<std::deque<int>> hicc::make_unique<std::deque<int>>()")]
173    #[member(class = DequeInt, method = new)]
174    pub fn deque_int_new() -> DequeInt;
175    /// 对应`std::deque<std::string>`
176    pub class DequeString = deque<string>;
177    #[cpp(func = "std::unique_ptr<std::deque<std::string>> hicc::make_unique<std::deque<std::string>>()")]
178    #[member(class = DequeString, method = new)]
179    pub fn deque_string_new() -> DequeString;
180    
181    /// 对应`std::vector<int>`
182    pub class VecInt = vector<hicc::Pod<i32>>;
183    #[cpp(func = "std::unique_ptr<std::vector<int>> hicc::make_unique<std::vector<int>>()")]
184    #[member(class = VecInt, method = new)]
185    pub fn vec_int_new() -> VecInt;
186
187    /// 对应`std::vector<std::string>`
188    pub class VecString = vector<string>;
189    #[cpp(func = "std::unique_ptr<std::vector<std::string>> hicc::make_unique<std::vector<std::string>>()")]
190    #[member(class = VecString, method = new)]
191    pub fn vec_string_new() -> VecString;
192
193    /// 对应`std::vector<std::vector<std::string>>`
194    pub class VecVecString = vector<vector<string>>;
195    #[cpp(func = "std::unique_ptr<std::vector<std::vector<std::string>>> hicc::make_unique<std::vector<std::vector<std::string>>>()")]
196    #[member(class = VecVecString, method = new)]
197    pub fn vec_vec_string_new() -> VecVecString;
198
199    #[cpp(func = "std::unique_ptr<std::vector<bool>> hicc::make_unique<std::vector<bool>>()")]
200    #[member(class = VecBool, method = new)]
201    pub fn vec_bool_new() -> VecBool;
202    
203    /// 对应`std::stack<int>`
204    pub class StackInt = stack<hicc::Pod<i32>>;
205    #[cpp(func = "std::unique_ptr<std::stack<int>> hicc::make_unique<std::stack<int>>()")]
206    #[member(class = StackInt, method = new)]
207    pub fn stack_int_new() -> StackInt;
208    /// 对应`std::stack<std::string>`
209    pub class StackString = stack<string>;
210    #[cpp(func = "std::unique_ptr<std::stack<std::string>> hicc::make_unique<std::stack<std::string>>()")]
211    #[member(class = StackString, method = new)]
212    pub fn stack_string_new() -> StackString;
213
214    /// 对应`std::queue<int>`
215    pub class QueueInt = queue<hicc::Pod<i32>>;
216    #[cpp(func = "std::unique_ptr<std::queue<int>> hicc::make_unique<std::queue<int>>()")]
217    #[member(class = QueueInt, method = new)]
218    pub fn queue_int_new() -> QueueInt;
219
220    /// 对应`std::queue<std::string>`
221    pub class QueueString = queue<string>;
222    #[cpp(func = "std::unique_ptr<std::queue<std::string>> hicc::make_unique<std::queue<std::string>>()")]
223    #[member(class = QueueString, method = new)]
224    pub fn queue_string_new() -> QueueString;
225
226    /// 对应`std::priority_queue<int>`
227    pub class PriorityQueueInt = priority_queue<hicc::Pod<i32>>;
228    #[cpp(func = "std::unique_ptr<std::priority_queue<int>> hicc::make_unique<std::priority_queue<int>>()")]
229    #[member(class = PriorityQueueInt, method = new)]
230    pub fn priority_queue_int_new() -> PriorityQueueInt;
231
232    /// 对应`std::list<int>`
233    pub class ListInt = list<hicc::Pod<i32>>;
234    #[cpp(func = "std::unique_ptr<std::list<int>> hicc::make_unique<std::list<int>>()")]
235    #[member(class = ListInt, method = new)]
236    pub fn list_int_new() -> ListInt;
237    /// 对应`std::list<std::string>`
238    pub class ListString = list<string>;
239    #[cpp(func = "std::unique_ptr<std::list<std::string>> hicc::make_unique<std::list<std::string>>()")]
240    #[member(class = ListString, method = new)]
241    pub fn list_string_new() -> ListString;
242
243    /// 对应`std::forward_list<int>`
244    pub class ForwardListInt = forward_list<hicc::Pod<i32>>;
245    #[cpp(func = "std::unique_ptr<std::forward_list<int>> hicc::make_unique<std::forward_list<int>>()")]
246    #[member(class = ForwardListInt, method = new)]
247    pub fn forward_list_int_new() -> ForwardListInt;
248
249    /// 对应`std::forward_list<std::string>`
250    pub class ForwardListString = forward_list<string>;
251    #[cpp(func = "std::unique_ptr<std::forward_list<std::string>> hicc::make_unique<std::forward_list<std::string>>()")]
252    #[member(class = ForwardListString, method = new)]
253    pub fn forward_list_string_new() -> ForwardListString;
254
255    /// 对应`std::set<int>`
256    pub class SetInt = set<hicc::Pod<i32>>;
257    /// 对应`std::set<std::string>`
258    pub class SetString = set<string>;
259    /// 对应`std::multiset<int>`
260    pub class MultiSetInt = multiset<hicc::Pod<i32>>;
261    /// 对应`std::multiset<std::string>`
262    pub class MultiSetString = multiset<string>;
263
264    #[cpp(func = "std::unique_ptr<std::set<int>> hicc::make_unique<std::set<int>>()")]
265    #[member(class = SetInt, method = new)]
266    pub fn set_int_new() -> SetInt;
267    #[cpp(func = "std::unique_ptr<std::set<std::string>> hicc::make_unique<std::set<std::string>>()")]
268    #[member(class = SetString, method = new)]
269    pub fn set_string_new() -> SetString;
270
271    #[cpp(func = "std::unique_ptr<std::multiset<int>> hicc::make_unique<std::multiset<int>>()")]
272    #[member(class = MultiSetInt, method = new)]
273    pub fn multiset_int_new() -> MultiSetInt;
274    #[cpp(func = "std::unique_ptr<std::multiset<std::string>> hicc::make_unique<std::multiset<std::string>>()")]
275    #[member(class = MultiSetString, method = new)]
276    pub fn multiset_string_new() -> MultiSetString;
277
278    /// 对应`std::map<std::string, std::string>`
279    pub class MapStringString = map<string, string>;
280    /// 对应`std::map<std::string, int>`
281    pub class MapStringInt = map<string, hicc::Pod<i32>>;
282    /// 对应`std::map<int, std::string>`
283    pub class MapIntString = map<hicc::Pod<i32>, string>;
284    /// 对应`std::map<int, int>`
285    pub class MapIntInt = map<hicc::Pod<i32>, hicc::Pod<i32>>;
286
287    #[member(class = MapStringString, method = new)]
288    #[cpp(func = "std::map<std::string, std::string> hicc::make_constructor<std::map<std::string, std::string>>()")]
289    pub fn map_string_string_new() -> MapStringString;
290    #[member(class = MapStringInt, method = new)]
291    #[cpp(func = "std::map<std::string, int> hicc::make_constructor<std::map<std::string, int>>()")]
292    pub fn map_string_int_new() -> MapStringInt;
293    #[member(class = MapIntString, method = new)]
294    #[cpp(func = "std::map<int, std::string> hicc::make_constructor<std::map<int, std::string>>()")]
295    pub fn map_int_string_new() -> MapIntString;
296    #[member(class = MapIntInt, method = new)]
297    #[cpp(func = "std::map<int, int> hicc::make_constructor<std::map<int, int>>()")]
298    pub fn map_int_int_new() -> MapIntInt;
299
300    /// 对应`std::multimap<std::string, std::string>`
301    pub class MultiMapStringString = multimap<string, string>;
302    /// 对应`std::multimap<std::string, int>`
303    pub class MultiMapStringInt = multimap<string, hicc::Pod<i32>>;
304    /// 对应`std::multimap<int, std::string>`
305    pub class MultiMapIntString = multimap<hicc::Pod<i32>, string>;
306    /// 对应`std::multimap<int, int>`
307    pub class MultiMapIntInt = multimap<hicc::Pod<i32>, hicc::Pod<i32>>;
308
309    #[member(class = MultiMapStringString, method = new)]
310    #[cpp(func = "std::multimap<std::string, std::string> hicc::make_constructor<std::multimap<std::string, std::string>>()")]
311    pub fn multimap_string_string_new() -> MultiMapStringString;
312    #[member(class = MultiMapStringInt, method = new)]
313    #[cpp(func = "std::multimap<std::string, int> hicc::make_constructor<std::multimap<std::string, int>>()")]
314    pub fn multimap_string_int_new() -> MultiMapStringInt;
315    #[member(class = MultiMapIntString, method = new)]
316    #[cpp(func = "std::multimap<int, std::string> hicc::make_constructor<std::multimap<int, std::string>>()")]
317    pub fn multimap_int_string_new() -> MultiMapIntString;
318    #[member(class = MultiMapIntInt, method = new)]
319    #[cpp(func = "std::multimap<int, int> hicc::make_constructor<std::multimap<int, int>>()")]
320    pub fn multimap_int_int_new() -> MultiMapIntInt;
321    
322    /// 对应`std::unordered_set<int>`
323    pub class UnorderedSetInt = unordered_set<hicc::Pod<i32>>;
324    /// 对应`std::unordered_set<std::string>`
325    pub class UnorderedSetString = unordered_set<string>;
326    /// 对应`std::unordered_multiset<int>`
327    pub class UnorderedMultiSetInt = unordered_multiset<hicc::Pod<i32>>;
328    /// 对应`std::unordered_multiset<std::string>`
329    pub class UnorderedMultiSetString = unordered_multiset<string>;
330
331    #[member(class = UnorderedSetInt, method = new)]
332    #[cpp(func = "std::unordered_set<int> hicc::make_constructor<std::unordered_set<int>>()")]
333    pub fn unordered_set_int_new() -> UnorderedSetInt;
334    #[member(class = UnorderedSetString, method = new)]
335    #[cpp(func = "std::unordered_set<std::string> hicc::make_constructor<std::unordered_set<std::string>>()")]
336    pub fn unordered_set_string_new() -> UnorderedSetString;
337
338    #[member(class = UnorderedMultiSetInt, method = new)]
339    #[cpp(func = "std::unordered_multiset<int> hicc::make_constructor<std::unordered_multiset<int>>()")]
340    pub fn unordered_multiset_int_new() -> UnorderedMultiSetInt;
341    #[member(class = UnorderedMultiSetString, method = new)]
342    #[cpp(func = "std::unordered_multiset<std::string> hicc::make_constructor<std::unordered_multiset<std::string>>()")]
343    pub fn unordered_multiset_string_new() -> UnorderedMultiSetString;
344
345    /// 对应`std::unordered_map<std::string, std::string>`
346    pub class UnorderedMapStringString = unordered_map<string, string>;
347    /// 对应`std::unordered_map<std::string, int>`
348    pub class UnorderedMapStringInt = unordered_map<string, hicc::Pod<i32>>;
349    /// 对应`std::unordered_map<int, std::string>`
350    pub class UnorderedMapIntString = unordered_map<hicc::Pod<i32>, string>;
351    /// 对应`std::unordered_map<int, int>`
352    pub class UnorderedMapIntInt = unordered_map<hicc::Pod<i32>, hicc::Pod<i32>>;
353
354    #[member(class = UnorderedMapStringString, method = new)]
355    #[cpp(func = "std::unordered_map<std::string, std::string> hicc::make_constructor<std::unordered_map<std::string, std::string>>()")]
356    pub fn unordered_map_string_string_new() -> UnorderedMapStringString;
357    #[member(class = UnorderedMapStringInt, method = new)]
358    #[cpp(func = "std::unordered_map<std::string, int> hicc::make_constructor<std::unordered_map<std::string, int>>()")]
359    pub fn unordered_map_string_int_new() -> UnorderedMapStringInt;
360    #[member(class = UnorderedMapIntString, method = new)]
361    #[cpp(func = "std::unordered_map<int, std::string> hicc::make_constructor<std::unordered_map<int, std::string>>()")]
362    pub fn unordered_map_int_string_new() -> UnorderedMapIntString;
363    #[member(class = UnorderedMapIntInt, method = new)]
364    #[cpp(func = "std::unordered_map<int, int> hicc::make_constructor<std::unordered_map<int, int>>()")]
365    pub fn unordered_map_int_int_new() -> UnorderedMapIntInt;
366
367    /// 对应`std::unordered_multimap<std::string, std::string>`
368    pub class UnorderedMultiMapStringString = unordered_multimap<string, string>;
369    /// 对应`std::unordered_multimap<std::string, int>`
370    pub class UnorderedMultiMapStringInt = unordered_multimap<string, hicc::Pod<i32>>;
371    /// 对应`std::unordered_multimap<int, std::string>`
372    pub class UnorderedMultiMapIntString = unordered_multimap<hicc::Pod<i32>, string>;
373    /// 对应`std::unordered_multimap<int, int>`
374    pub class UnorderedMultiMapIntInt = unordered_multimap<hicc::Pod<i32>, hicc::Pod<i32>>;
375
376    #[member(class = UnorderedMultiMapStringString, method = new)]
377    #[cpp(func = "std::unordered_multimap<std::string, std::string> hicc::make_constructor<std::unordered_multimap<std::string, std::string>>()")]
378    pub fn unordered_multimap_string_string_new() -> UnorderedMultiMapStringString;
379    #[member(class = UnorderedMultiMapStringInt, method = new)]
380    #[cpp(func = "std::unordered_multimap<std::string, int> hicc::make_constructor<std::unordered_multimap<std::string, int>>()")]
381    pub fn unordered_multimap_string_int_new() -> UnorderedMultiMapStringInt;
382    #[member(class = UnorderedMultiMapIntString, method = new)]
383    #[cpp(func = "std::unordered_multimap<int, std::string> hicc::make_constructor<std::unordered_multimap<int, std::string>>()")]
384    pub fn unordered_multimap_int_string_new() -> UnorderedMultiMapIntString;
385    #[member(class = UnorderedMultiMapIntInt, method = new)]
386    #[cpp(func = "std::unordered_multimap<int, int> hicc::make_constructor<std::unordered_multimap<int, int>>()")]
387    pub fn unordered_multimap_int_int_new() -> UnorderedMultiMapIntInt;
388}