use super::array::Il2cppArray;
use std::ffi::c_void;
use std::marker::PhantomData;
#[repr(C)]
pub struct Il2cppDictionary<K: Copy, V: Copy> {
pub klass: *mut c_void,
pub monitor: *mut c_void,
pub buckets: *mut Il2cppArray<i32>,
pub entries: *mut Il2cppArray<c_void>,
pub keys: *mut Il2cppArray<K>,
pub values: *mut Il2cppArray<V>,
pub touched_slots: i32,
pub empty_slot: i32,
pub count: i32,
_phantom_k: PhantomData<K>,
_phantom_v: PhantomData<V>,
}
impl<K: Copy, V: Copy> Il2cppDictionary<K, V> {
pub fn keys_array(&self) -> Option<&Il2cppArray<K>> {
if self.keys.is_null() {
None
} else {
unsafe { Some(&*self.keys) }
}
}
pub fn values_array(&self) -> Option<&Il2cppArray<V>> {
if self.values.is_null() {
None
} else {
unsafe { Some(&*self.values) }
}
}
pub fn get_keys(&self) -> Vec<K> {
self.keys_array()
.map(|arr| arr.to_vector())
.unwrap_or_default()
}
pub fn get_values(&self) -> Vec<V> {
self.values_array()
.map(|arr| arr.to_vector())
.unwrap_or_default()
}
pub fn keys_pointer(&self) -> Option<*const K> {
self.keys_array().map(|arr| arr.get_pointer())
}
pub fn values_pointer(&self) -> Option<*const V> {
self.values_array().map(|arr| arr.get_pointer())
}
}