pub struct CData<T>(pub T)
where
T: AsCData;
Expand description
CData A wrapper type for reading/writing rust values as luajit cdata.
use tlua::{Lua, CData};
let lua = Lua::new();
lua.set("cdata", CData(1337_i16));
let ty: String = lua.eval("return require('ffi').typeof(cdata)").unwrap();
assert_eq!(ty, "ctype<short>");
let CData(num): CData<i16> = lua.get("cdata").unwrap();
assert_eq!(num, 1337);
For this to work the type must implement AsCData
which is true for
builtin numbers and some pointers but can also be implemented for user
defined types:
use tlua::{AsCData, CData};
use tlua::{Lua, AsLua, ffi, c_ptr};
#[repr(C)]
#[derive(Debug, PartialEq, Clone, Copy)]
struct S { i: i32, f: f32 }
// let luajit know about our struct
lua.exec("ffi.cdef[[ struct S { int i; float f; }; ]]").unwrap();
// save the CTypeID of our struct
static mut CTID_STRUCT_S: Option<ffi::CTypeID> = None;
let ctid = unsafe { ffi::luaL_ctypeid(lua.as_lua(), c_ptr!("struct S")) };
unsafe { CTID_STRUCT_S = Some(ctid) }
// implement AsCData for our struct so that it can be wrapped with CData
unsafe impl AsCData for S {
fn ctypeid() -> ffi::CTypeID {
unsafe { CTID_STRUCT_S.unwrap() }
}
}
// wirte our struct into a lua variable as cdata
lua.set("tmp", CData(S { i: 69, f: 420.0 }));
// check it's type
let ty: String = lua.eval("return type(tmp)").unwrap();
assert_eq!(ty, "cdata");
// read the value back
let CData(res): CData<S> = lua.get("tmp").unwrap();
assert_eq!(res, S { i: 69, f: 420.0 });
Tuple Fields§
§0: T
Trait Implementations§
source§impl<L, T> LuaRead<L> for CData<T>
impl<L, T> LuaRead<L> for CData<T>
source§fn lua_read_at_position(lua: L, index: NonZeroI32) -> ReadResult<Self, L>
fn lua_read_at_position(lua: L, index: NonZeroI32) -> ReadResult<Self, L>
Reads the data from Lua at a given position.
fn n_values_expected() -> i32
source§fn lua_read(lua: L) -> ReadResult<Self, L>
fn lua_read(lua: L) -> ReadResult<Self, L>
Reads the data from Lua.
fn lua_read_at_maybe_zero_position(lua: L, index: i32) -> ReadResult<Self, L>where
L: AsLua,
source§impl<T> Ord for CData<T>
impl<T> Ord for CData<T>
source§impl<T> PartialEq for CData<T>
impl<T> PartialEq for CData<T>
source§impl<T> PartialOrd for CData<T>where
T: AsCData + PartialOrd,
impl<T> PartialOrd for CData<T>where
T: AsCData + PartialOrd,
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self
and other
) and is used by the <=
operator. Read moresource§impl<L, T> PushInto<L> for CData<T>
impl<L, T> PushInto<L> for CData<T>
impl<T> Copy for CData<T>
impl<T> Eq for CData<T>
impl<L, T> PushOneInto<L> for CData<T>
impl<T> StructuralEq for CData<T>where
T: AsCData,
impl<T> StructuralPartialEq for CData<T>where
T: AsCData,
Auto Trait Implementations§
impl<T> RefUnwindSafe for CData<T>where
T: RefUnwindSafe,
impl<T> Send for CData<T>where
T: Send,
impl<T> Sync for CData<T>where
T: Sync,
impl<T> Unpin for CData<T>where
T: Unpin,
impl<T> UnwindSafe for CData<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more