summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2024-05-01 08:33:14 -0400
committerRyan Snyder <ryan@vector35.com>2024-05-01 08:33:14 -0400
commit2fb7daaf3210c4984f20444560145e776b586601 (patch)
tree914999caa51ed52eefa6975f66a21743532f7d5b /rust/src
parent0e1e0d995f99b64e4282b546cbb6d9fdbc1b8f1a (diff)
parent152219cd95f9dafb2acfe4aab7baa17204e02b4e (diff)
Merge branch 'fix-metadata-from' of github.com:rbran/binaryninja-api into dev
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/metadata.rs79
1 files changed, 30 insertions, 49 deletions
diff --git a/rust/src/metadata.rs b/rust/src/metadata.rs
index 35f3b812..6f026a04 100644
--- a/rust/src/metadata.rs
+++ b/rust/src/metadata.rs
@@ -403,12 +403,6 @@ impl From<&str> for Ref<Metadata> {
}
}
-impl<T: Into<Ref<Metadata>>> From<&T> for Ref<Metadata> {
- fn from(value: &T) -> Self {
- value.into()
- }
-}
-
impl From<&Vec<u8>> for Ref<Metadata> {
fn from(value: &Vec<u8>) -> Self {
unsafe { Metadata::ref_from_raw(BNCreateMetadataRawData(value.as_ptr(), value.len())) }
@@ -441,16 +435,15 @@ impl From<&Array<Metadata>> for Ref<Metadata> {
impl<S: BnStrCompatible> From<HashMap<S, Ref<Metadata>>> for Ref<Metadata> {
fn from(value: HashMap<S, Ref<Metadata>>) -> Self {
- let mut key_refs: Vec<S::Result> = vec![];
- let mut keys: Vec<*const c_char> = vec![];
- let mut values: Vec<*mut BNMetadata> = vec![];
- for (k, v) in value.into_iter() {
- key_refs.push(k.into_bytes_with_nul());
- values.push(v.as_ref().handle);
- }
- for k in &key_refs {
- keys.push(k.as_ref().as_ptr() as *const c_char);
- }
+ let data: Vec<(S::Result, Ref<Metadata>)> = value
+ .into_iter()
+ .map(|(k, v)| (k.into_bytes_with_nul(), v))
+ .collect();
+ let mut keys: Vec<*const c_char> = data
+ .iter()
+ .map(|(k, _)| k.as_ref().as_ptr() as *const c_char)
+ .collect();
+ let mut values: Vec<*mut BNMetadata> = data.iter().map(|(_, v)| v.handle).collect();
unsafe {
Metadata::ref_from_raw(BNCreateMetadataValueStore(
@@ -462,19 +455,21 @@ impl<S: BnStrCompatible> From<HashMap<S, Ref<Metadata>>> for Ref<Metadata> {
}
}
-impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>> From<&[(S, T)]> for Ref<Metadata> {
+impl<S, T> From<&[(S, T)]> for Ref<Metadata>
+where
+ S: BnStrCompatible + Copy,
+ for<'a> &'a T: Into<Ref<Metadata>>,
+{
fn from(value: &[(S, T)]) -> Self {
- let mut key_refs: Vec<S::Result> = vec![];
- let mut keys: Vec<*const c_char> = vec![];
- let mut values: Vec<*mut BNMetadata> = vec![];
- for (k, v) in value.iter() {
- key_refs.push(k.into_bytes_with_nul());
- let value_metadata: Ref<Metadata> = v.into();
- values.push(value_metadata.handle);
- }
- for k in &key_refs {
- keys.push(k.as_ref().as_ptr() as *const c_char);
- }
+ let data: Vec<(S::Result, Ref<Metadata>)> = value
+ .into_iter()
+ .map(|(k, v)| (k.into_bytes_with_nul(), v.into()))
+ .collect();
+ let mut keys: Vec<*const c_char> = data
+ .iter()
+ .map(|(k, _)| k.as_ref().as_ptr() as *const c_char)
+ .collect();
+ let mut values: Vec<*mut BNMetadata> = data.iter().map(|(_, v)| v.handle).collect();
unsafe {
Metadata::ref_from_raw(BNCreateMetadataValueStore(
@@ -486,29 +481,15 @@ impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>> From<&[(S, T)]> for Ref<
}
}
-impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>, const N: usize> From<[(S, T); N]>
- for Ref<Metadata>
+impl<S, T, const N: usize> From<[(S, T); N]> for Ref<Metadata>
+where
+ S: BnStrCompatible + Copy,
+ for<'a> &'a T: Into<Ref<Metadata>>,
{
fn from(value: [(S, T); N]) -> Self {
- let mut key_refs: Vec<S::Result> = vec![];
- let mut keys: Vec<*const c_char> = vec![];
- let mut values: Vec<*mut BNMetadata> = vec![];
- for (k, v) in value.into_iter() {
- key_refs.push(k.into_bytes_with_nul());
- let value_metadata: Ref<Metadata> = v.into();
- values.push(value_metadata.handle);
- }
- for k in &key_refs {
- keys.push(k.as_ref().as_ptr() as *const c_char);
- }
-
- unsafe {
- Metadata::ref_from_raw(BNCreateMetadataValueStore(
- keys.as_mut_ptr(),
- values.as_mut_ptr(),
- keys.len(),
- ))
- }
+ let slice = &value[..];
+ // use the `impl From<&[(S, T)]>`
+ slice.into()
}
}