use glib::translate::*;
use std::collections::HashMap;
use std::ffi::{c_char, c_void};
use std::ptr;
#[doc(alias = "GHashTable")]
pub(crate) struct HashTable(ptr::NonNull<glib::ffi::GHashTable>);
impl Drop for HashTable {
#[inline]
fn drop(&mut self) {
unsafe { glib::ffi::g_hash_table_unref(self.0.as_ptr()) }
}
}
pub(crate) struct StringVariantHashMap<'a>(pub(crate) &'a HashMap<String, glib::Variant>);
#[allow(clippy::implicit_hasher)]
impl<'a> ToGlibPtr<'a, *mut glib::ffi::GHashTable> for StringVariantHashMap<'a> {
type Storage = HashTable;
#[inline]
fn to_glib_none(&self) -> Stash<'a, *mut glib::ffi::GHashTable, Self> {
let ptr = self.to_glib_full();
Stash(ptr, HashTable(unsafe { ptr::NonNull::new_unchecked(ptr) }))
}
#[inline]
fn to_glib_full(&self) -> *mut glib::ffi::GHashTable {
unsafe extern "C" fn value_destroy_func(ptr: *mut c_void) {
unsafe { glib::ffi::g_variant_unref(ptr as *mut glib::ffi::GVariant) }
}
unsafe {
let ptr = glib::ffi::g_hash_table_new_full(
Some(glib::ffi::g_str_hash),
Some(glib::ffi::g_str_equal),
Some(glib::ffi::g_free),
Some(value_destroy_func),
);
for (k, v) in self.0 {
let k: *mut c_char = k.to_glib_full();
let v: *mut glib::ffi::GVariant = v.to_glib_full();
glib::ffi::g_hash_table_insert(ptr, k as *mut _, v as *mut _);
}
ptr
}
}
}