1 use libc::c_int; 2 use std::marker::PhantomData; 3 4 /// A slot in a type's "extra data" structure. 5 /// 6 /// It is parameterized over the type containing the extra data as well as the 7 /// type of the data in the slot. 8 pub struct Index<T, U>(c_int, PhantomData<(T, U)>); 9 10 impl<T, U> Copy for Index<T, U> {} 11 12 impl<T, U> Clone for Index<T, U> { clone(&self) -> Index<T, U>13 fn clone(&self) -> Index<T, U> { 14 *self 15 } 16 } 17 18 impl<T, U> Index<T, U> { 19 /// Creates an `Index` from a raw integer index. 20 /// 21 /// # Safety 22 /// 23 /// The caller must ensure that the index correctly maps to a `U` value stored in a `T`. from_raw(idx: c_int) -> Index<T, U>24 pub unsafe fn from_raw(idx: c_int) -> Index<T, U> { 25 Index(idx, PhantomData) 26 } 27 28 #[allow(clippy::trivially_copy_pass_by_ref)] as_raw(&self) -> c_int29 pub fn as_raw(&self) -> c_int { 30 self.0 31 } 32 } 33