Skip to content

Commit 2fb7daa

Browse files
committed
Merge branch 'fix-metadata-from' of github.com:rbran/binaryninja-api into dev
2 parents 0e1e0d9 + 152219c commit 2fb7daa

File tree

1 file changed

+30
-49
lines changed

1 file changed

+30
-49
lines changed

rust/src/metadata.rs

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,6 @@ impl From<&str> for Ref<Metadata> {
403403
}
404404
}
405405

406-
impl<T: Into<Ref<Metadata>>> From<&T> for Ref<Metadata> {
407-
fn from(value: &T) -> Self {
408-
value.into()
409-
}
410-
}
411-
412406
impl From<&Vec<u8>> for Ref<Metadata> {
413407
fn from(value: &Vec<u8>) -> Self {
414408
unsafe { Metadata::ref_from_raw(BNCreateMetadataRawData(value.as_ptr(), value.len())) }
@@ -441,16 +435,15 @@ impl From<&Array<Metadata>> for Ref<Metadata> {
441435

442436
impl<S: BnStrCompatible> From<HashMap<S, Ref<Metadata>>> for Ref<Metadata> {
443437
fn from(value: HashMap<S, Ref<Metadata>>) -> Self {
444-
let mut key_refs: Vec<S::Result> = vec![];
445-
let mut keys: Vec<*const c_char> = vec![];
446-
let mut values: Vec<*mut BNMetadata> = vec![];
447-
for (k, v) in value.into_iter() {
448-
key_refs.push(k.into_bytes_with_nul());
449-
values.push(v.as_ref().handle);
450-
}
451-
for k in &key_refs {
452-
keys.push(k.as_ref().as_ptr() as *const c_char);
453-
}
438+
let data: Vec<(S::Result, Ref<Metadata>)> = value
439+
.into_iter()
440+
.map(|(k, v)| (k.into_bytes_with_nul(), v))
441+
.collect();
442+
let mut keys: Vec<*const c_char> = data
443+
.iter()
444+
.map(|(k, _)| k.as_ref().as_ptr() as *const c_char)
445+
.collect();
446+
let mut values: Vec<*mut BNMetadata> = data.iter().map(|(_, v)| v.handle).collect();
454447

455448
unsafe {
456449
Metadata::ref_from_raw(BNCreateMetadataValueStore(
@@ -462,19 +455,21 @@ impl<S: BnStrCompatible> From<HashMap<S, Ref<Metadata>>> for Ref<Metadata> {
462455
}
463456
}
464457

465-
impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>> From<&[(S, T)]> for Ref<Metadata> {
458+
impl<S, T> From<&[(S, T)]> for Ref<Metadata>
459+
where
460+
S: BnStrCompatible + Copy,
461+
for<'a> &'a T: Into<Ref<Metadata>>,
462+
{
466463
fn from(value: &[(S, T)]) -> Self {
467-
let mut key_refs: Vec<S::Result> = vec![];
468-
let mut keys: Vec<*const c_char> = vec![];
469-
let mut values: Vec<*mut BNMetadata> = vec![];
470-
for (k, v) in value.iter() {
471-
key_refs.push(k.into_bytes_with_nul());
472-
let value_metadata: Ref<Metadata> = v.into();
473-
values.push(value_metadata.handle);
474-
}
475-
for k in &key_refs {
476-
keys.push(k.as_ref().as_ptr() as *const c_char);
477-
}
464+
let data: Vec<(S::Result, Ref<Metadata>)> = value
465+
.into_iter()
466+
.map(|(k, v)| (k.into_bytes_with_nul(), v.into()))
467+
.collect();
468+
let mut keys: Vec<*const c_char> = data
469+
.iter()
470+
.map(|(k, _)| k.as_ref().as_ptr() as *const c_char)
471+
.collect();
472+
let mut values: Vec<*mut BNMetadata> = data.iter().map(|(_, v)| v.handle).collect();
478473

479474
unsafe {
480475
Metadata::ref_from_raw(BNCreateMetadataValueStore(
@@ -486,29 +481,15 @@ impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>> From<&[(S, T)]> for Ref<
486481
}
487482
}
488483

489-
impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>, const N: usize> From<[(S, T); N]>
490-
for Ref<Metadata>
484+
impl<S, T, const N: usize> From<[(S, T); N]> for Ref<Metadata>
485+
where
486+
S: BnStrCompatible + Copy,
487+
for<'a> &'a T: Into<Ref<Metadata>>,
491488
{
492489
fn from(value: [(S, T); N]) -> Self {
493-
let mut key_refs: Vec<S::Result> = vec![];
494-
let mut keys: Vec<*const c_char> = vec![];
495-
let mut values: Vec<*mut BNMetadata> = vec![];
496-
for (k, v) in value.into_iter() {
497-
key_refs.push(k.into_bytes_with_nul());
498-
let value_metadata: Ref<Metadata> = v.into();
499-
values.push(value_metadata.handle);
500-
}
501-
for k in &key_refs {
502-
keys.push(k.as_ref().as_ptr() as *const c_char);
503-
}
504-
505-
unsafe {
506-
Metadata::ref_from_raw(BNCreateMetadataValueStore(
507-
keys.as_mut_ptr(),
508-
values.as_mut_ptr(),
509-
keys.len(),
510-
))
511-
}
490+
let slice = &value[..];
491+
// use the `impl From<&[(S, T)]>`
492+
slice.into()
512493
}
513494
}
514495

0 commit comments

Comments
 (0)