@@ -1860,7 +1860,58 @@ impl StructureBuilder {
1860
1860
}
1861
1861
}
1862
1862
1863
- // TODO : The other methods in the python version (type, members, remove, replace, etc)
1863
+ pub fn members ( & self ) -> Array < StructureMember > {
1864
+ let mut count = 0 ;
1865
+ let members_raw = unsafe { BNGetStructureBuilderMembers ( self . handle , & mut count) } ;
1866
+ unsafe { Array :: new ( members_raw, count, ( ) ) }
1867
+ }
1868
+
1869
+ pub fn index_by_name ( & self , name : & str ) -> Option < usize > {
1870
+ self . members ( ) . iter ( ) . position ( |member| member. name == name)
1871
+ }
1872
+
1873
+ pub fn index_by_offset ( & self , offset : u64 ) -> Option < usize > {
1874
+ self . members ( )
1875
+ . iter ( )
1876
+ . position ( |member| member. offset == offset)
1877
+ }
1878
+
1879
+ // Setters
1880
+
1881
+ pub fn clear_members ( & self ) {
1882
+ let len = self . members ( ) . len ( ) ;
1883
+ for idx in ( 0 ..len) . rev ( ) {
1884
+ self . remove ( idx)
1885
+ }
1886
+ }
1887
+
1888
+ pub fn add_members < ' a > ( & self , members : impl IntoIterator < Item = & ' a StructureMember > ) {
1889
+ for member in members {
1890
+ self . append ( & member. ty , & member. name , member. access , member. scope ) ;
1891
+ }
1892
+ }
1893
+
1894
+ pub fn set_members < ' a > ( & self , members : impl IntoIterator < Item = & ' a StructureMember > ) {
1895
+ self . clear_members ( ) ;
1896
+ self . add_members ( members) ;
1897
+ }
1898
+
1899
+ pub fn remove ( & self , index : usize ) {
1900
+ unsafe { BNRemoveStructureBuilderMember ( self . handle , index) }
1901
+ }
1902
+
1903
+ pub fn replace ( & self , index : usize , type_ : Conf < & Type > , name : & str , overwrite : bool ) {
1904
+ let name = name. into_bytes_with_nul ( ) ;
1905
+ let name_ptr = name. as_ptr ( ) as * const _ ;
1906
+
1907
+ let raw_type_ = BNTypeWithConfidence {
1908
+ type_ : type_. contents as * const Type as * mut _ ,
1909
+ confidence : type_. confidence ,
1910
+ } ;
1911
+ unsafe {
1912
+ BNReplaceStructureBuilderMember ( self . handle , index, & raw_type_, name_ptr, overwrite)
1913
+ }
1914
+ }
1864
1915
}
1865
1916
1866
1917
impl From < & Structure > for StructureBuilder {
@@ -2042,6 +2093,25 @@ impl StructureMember {
2042
2093
}
2043
2094
}
2044
2095
2096
+ impl CoreArrayProvider for StructureMember {
2097
+ type Raw = BNStructureMember ;
2098
+ type Context = ( ) ;
2099
+ }
2100
+
2101
+ unsafe impl CoreOwnedArrayProvider for StructureMember {
2102
+ unsafe fn free ( raw : * mut Self :: Raw , count : usize , _context : & Self :: Context ) {
2103
+ BNFreeStructureMemberList ( raw, count)
2104
+ }
2105
+ }
2106
+
2107
+ unsafe impl < ' a > CoreArrayWrapper < ' a > for StructureMember {
2108
+ type Wrapped = Guard < ' a , StructureMember > ;
2109
+
2110
+ unsafe fn wrap_raw ( raw : & ' a Self :: Raw , _context : & ' a Self :: Context ) -> Self :: Wrapped {
2111
+ Guard :: new ( StructureMember :: from_raw ( * raw) , & ( ) )
2112
+ }
2113
+ }
2114
+
2045
2115
#[ derive( Debug , Clone ) ]
2046
2116
pub struct InheritedStructureMember {
2047
2117
pub base : Ref < NamedTypeReference > ,
0 commit comments