@@ -15,16 +15,29 @@ pub enum ReferenceKind {
1515 Method = 1 ,
1616}
1717
18- /// Shared iterator over reference (id, kind) pairs
18+ #[ repr( C ) ]
19+ #[ derive( Debug , Clone , Copy ) ]
20+ pub struct CReference {
21+ id : u64 ,
22+ kind : ReferenceKind ,
23+ }
24+
25+ impl CReference {
26+ #[ must_use]
27+ pub fn new ( id : u64 , kind : ReferenceKind ) -> Self {
28+ Self { id, kind }
29+ }
30+ }
31+
1932#[ derive( Debug ) ]
2033pub struct ReferencesIter {
21- pub entries : Box < [ ( u64 , ReferenceKind ) ] > ,
34+ pub entries : Box < [ CReference ] > ,
2235 pub index : usize ,
2336}
2437
2538impl ReferencesIter {
2639 #[ must_use]
27- pub fn new ( entries : Box < [ ( u64 , ReferenceKind ) ] > ) -> * mut ReferencesIter {
40+ pub fn new ( entries : Box < [ CReference ] > ) -> * mut ReferencesIter {
2841 Box :: into_raw ( Box :: new ( ReferencesIter { entries, index : 0 } ) )
2942 }
3043}
@@ -41,23 +54,15 @@ pub unsafe extern "C" fn rdx_references_iter_len(iter: *const ReferencesIter) ->
4154 unsafe { ( & * iter) . entries . len ( ) }
4255}
4356
44- /// Advances the iterator and writes the next entry into the provided out params .
57+ /// Advances the iterator and writes the next entry into `out_ref` .
4558/// Returns `true` if an entry was written, or `false` if the iterator is exhausted or inputs are invalid.
4659///
4760/// # Safety
4861/// - `iter` must be a valid pointer previously returned by `ReferencesIter::new`.
49- /// - `out_id` and `out_kind` must be valid, writable pointers.
50- ///
51- /// # Panics
52- /// - If the iterator is exhausted or inputs are invalid.
53- /// - If the name, URI, start, or end pointers are invalid.
62+ /// - `out_ref` must be a valid, writable pointer.
5463#[ unsafe( no_mangle) ]
55- pub unsafe extern "C" fn rdx_references_iter_next (
56- iter : * mut ReferencesIter ,
57- out_id : * mut u64 ,
58- out_kind : * mut ReferenceKind ,
59- ) -> bool {
60- if iter. is_null ( ) || out_id. is_null ( ) || out_kind. is_null ( ) {
64+ pub unsafe extern "C" fn rdx_references_iter_next ( iter : * mut ReferencesIter , out_ref : * mut CReference ) -> bool {
65+ if iter. is_null ( ) || out_ref. is_null ( ) {
6166 return false ;
6267 }
6368
@@ -66,11 +71,10 @@ pub unsafe extern "C" fn rdx_references_iter_next(
6671 return false ;
6772 }
6873
69- let ( id , kind ) = it. entries [ it. index ] ;
74+ let entry = it. entries [ it. index ] ;
7075 it. index += 1 ;
7176 unsafe {
72- * out_id = id;
73- * out_kind = kind;
77+ * out_ref = entry;
7478 }
7579 true
7680}
0 commit comments