Don't need to fully name option and result structs
This commit is contained in:
parent
c70b043281
commit
8a49321110
@ -70,6 +70,40 @@ enum State<F: Future> {
|
|||||||
Complete,
|
Complete,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl<F: Future<Output: IntoFfi> + 'static> Type for lua_future<F> {
|
||||||
|
fn name() -> impl Display {
|
||||||
|
display!("__future_{:x}", type_id::<F>())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ty() -> TypeType {
|
||||||
|
TypeType::Aggregate
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cdecl(name: impl Display) -> impl Display {
|
||||||
|
display!("struct {} {name}", Self::name())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build(s: &mut TypeBuilder) {
|
||||||
|
s.cdef::<Self>().metatype::<Self>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl<F: Future<Output: IntoFfi> + 'static> Cdef for lua_future<F> {
|
||||||
|
fn build(s: &mut CdefBuilder) {
|
||||||
|
s.field_opaque(mem::offset_of!(Self, take)) // opaque .sig, .poll and .state
|
||||||
|
.field::<ExternCFn<(&mut Self,), <F::Output as IntoFfi>::Into>>("__take")
|
||||||
|
.field::<ExternCFn<(&mut Self,), ()>>("__drop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl<F: Future<Output: IntoFfi> + 'static> Metatype for lua_future<F> {
|
||||||
|
type Target = Self;
|
||||||
|
|
||||||
|
fn build(s: &mut MetatypeBuilder) {
|
||||||
|
s.metatable_raw("gc", luaify!(|self| self.__drop()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<F: Future<Output: IntoFfi>> lua_future<F> {
|
impl<F: Future<Output: IntoFfi>> lua_future<F> {
|
||||||
pub fn new(fut: F) -> Self {
|
pub fn new(fut: F) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -131,40 +165,6 @@ impl Future for lua_pollable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<F: Future<Output: IntoFfi> + 'static> Type for lua_future<F> {
|
|
||||||
fn name() -> impl Display {
|
|
||||||
display!("future__{:x}", type_id::<F>())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn ty() -> TypeType {
|
|
||||||
TypeType::Aggregate
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cdecl(name: impl Display) -> impl Display {
|
|
||||||
display!("struct {} {name}", Self::name())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn build(s: &mut TypeBuilder) {
|
|
||||||
s.cdef::<Self>().metatype::<Self>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<F: Future<Output: IntoFfi> + 'static> Cdef for lua_future<F> {
|
|
||||||
fn build(s: &mut CdefBuilder) {
|
|
||||||
s.field_opaque(mem::offset_of!(Self, take)) // opaque .sig, .poll and .state
|
|
||||||
.field::<ExternCFn<(&mut Self,), <F::Output as IntoFfi>::Into>>("__take")
|
|
||||||
.field::<ExternCFn<(&mut Self,), ()>>("__drop");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<F: Future<Output: IntoFfi> + 'static> Metatype for lua_future<F> {
|
|
||||||
type Target = Self;
|
|
||||||
|
|
||||||
fn build(s: &mut MetatypeBuilder) {
|
|
||||||
s.metatable_raw("gc", luaify!(|self| self.__drop()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<F: Future<Output: IntoFfi> + 'static> IntoFfi for lua_future<F> {
|
unsafe impl<F: Future<Output: IntoFfi> + 'static> IntoFfi for lua_future<F> {
|
||||||
type Into = lua_future<F>;
|
type Into = lua_future<F>;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
__internal::{disp, display},
|
__internal::{disp, display, type_id},
|
||||||
Cdef, CdefBuilder, IntoFfi, KEEP_FN, Type, TypeBuilder, TypeType,
|
Cdef, CdefBuilder, IntoFfi, KEEP_FN, Type, TypeBuilder, TypeType,
|
||||||
};
|
};
|
||||||
use std::{ffi::c_int, fmt::Display};
|
use std::{ffi::c_int, fmt::Display};
|
||||||
@ -11,9 +11,9 @@ pub enum lua_option<T> {
|
|||||||
Some(T), // __tag = 1
|
Some(T), // __tag = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: Type> Type for lua_option<T> {
|
unsafe impl<T: Type + 'static> Type for lua_option<T> {
|
||||||
fn name() -> impl Display {
|
fn name() -> impl Display {
|
||||||
display!("option__{}", T::name())
|
display!("__option_{:x}", type_id::<T>())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ty() -> TypeType {
|
fn ty() -> TypeType {
|
||||||
@ -29,14 +29,14 @@ unsafe impl<T: Type> Type for lua_option<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: Type> Cdef for lua_option<T> {
|
unsafe impl<T: Type + 'static> Cdef for lua_option<T> {
|
||||||
fn build(b: &mut CdefBuilder) {
|
fn build(b: &mut CdefBuilder) {
|
||||||
b.field::<c_int>("__tag");
|
b.field::<c_int>("__tag");
|
||||||
(T::ty() != TypeType::Void).then(|| b.field::<T>("__value"));
|
(T::ty() != TypeType::Void).then(|| b.field::<T>("__value"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: IntoFfi> IntoFfi for Option<T> {
|
unsafe impl<T: IntoFfi<Into: 'static>> IntoFfi for Option<T> {
|
||||||
type Into = lua_option<T::Into>;
|
type Into = lua_option<T::Into>;
|
||||||
|
|
||||||
fn convert(self) -> Self::Into {
|
fn convert(self) -> Self::Into {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
__internal::{disp, display},
|
__internal::{disp, display, type_id},
|
||||||
Cdef, CdefBuilder, IntoFfi, KEEP_FN, Type, TypeBuilder, TypeType,
|
Cdef, CdefBuilder, IntoFfi, KEEP_FN, Type, TypeBuilder, TypeType,
|
||||||
string::{DROP_BUFFER_FN, lua_buffer},
|
string::{DROP_BUFFER_FN, lua_buffer},
|
||||||
};
|
};
|
||||||
@ -12,9 +12,9 @@ pub enum lua_result<T> {
|
|||||||
Ok(T), // __tag = 1
|
Ok(T), // __tag = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: Type> Type for lua_result<T> {
|
unsafe impl<T: Type + 'static> Type for lua_result<T> {
|
||||||
fn name() -> impl Display {
|
fn name() -> impl Display {
|
||||||
display!("result__{}", T::name())
|
display!("__result_{:x}", type_id::<T>())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ty() -> TypeType {
|
fn ty() -> TypeType {
|
||||||
@ -30,7 +30,7 @@ unsafe impl<T: Type> Type for lua_result<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: Type> Cdef for lua_result<T> {
|
unsafe impl<T: Type + 'static> Cdef for lua_result<T> {
|
||||||
fn build(b: &mut CdefBuilder) {
|
fn build(b: &mut CdefBuilder) {
|
||||||
b.field::<c_int>("__tag").inner_union(|b| {
|
b.field::<c_int>("__tag").inner_union(|b| {
|
||||||
(T::ty() != TypeType::Void).then(|| b.field::<T>("__value"));
|
(T::ty() != TypeType::Void).then(|| b.field::<T>("__value"));
|
||||||
@ -39,7 +39,7 @@ unsafe impl<T: Type> Cdef for lua_result<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: IntoFfi, E: Display> IntoFfi for Result<T, E> {
|
unsafe impl<T: IntoFfi<Into: 'static>, E: Display> IntoFfi for Result<T, E> {
|
||||||
type Into = lua_result<T::Into>;
|
type Into = lua_result<T::Into>;
|
||||||
|
|
||||||
fn convert(self) -> Self::Into {
|
fn convert(self) -> Self::Into {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user