Skip to content

Commit 48d440a

Browse files
rbranElykDeer
authored andcommitted
add StructureBuilder missing python methods
1 parent 29b6267 commit 48d440a

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

rust/src/types.rs

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1860,7 +1860,58 @@ impl StructureBuilder {
18601860
}
18611861
}
18621862

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+
}
18641915
}
18651916

18661917
impl From<&Structure> for StructureBuilder {
@@ -2042,6 +2093,25 @@ impl StructureMember {
20422093
}
20432094
}
20442095

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+
20452115
#[derive(Debug, Clone)]
20462116
pub struct InheritedStructureMember {
20472117
pub base: Ref<NamedTypeReference>,

0 commit comments

Comments
 (0)