libmirage 0.1.1

Rust bindings for libMirage
Documentation
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
        }
    }
}