Type aliases
Sometimes we don't want to rename a type but create additional aliases for it, This is particularly useful with parametric opaque types whose constructor can't infer its parameters from the arguments.
The syntax is type {{Name}} = {{TypeConstructor}}
. The alias doesn't inherit any constructors, they must be defined for every alias separately.
use std::marker::PhantomData;
use jlrs::{
data::{
managed::{ccall_ref::CCallRefRet, value::typed::TypedValue},
types::{
construct_type::ConstructType,
foreign_type::{ParametricBase, ParametricVariant},
},
},
impl_type_parameters, impl_variant_parameters,
prelude::*,
weak_handle,
};
pub struct HasParam<T> {
data: isize,
_param: PhantomData<T>,
}
impl<T> HasParam<T>
where
T: 'static + Send + Sync + ConstructType,
{
fn new(data: isize) -> CCallRefRet<HasParam<T>> {
match weak_handle!() {
Ok(handle) => {
let data = HasParam {
data,
_param: PhantomData,
};
CCallRefRet::new(TypedValue::new(handle, data).leak())
}
Err(_) => panic!("not called from Julia"),
}
}
fn data(&self) -> isize {
self.data
}
}
// Safety: we've correctly mapped the generics to type parameters
unsafe impl<T> ParametricBase for HasParam<T>
where
T: 'static + Send + Sync + ConstructType,
{
type Key = HasParam<()>;
impl_type_parameters!('T');
}
// Safety: we've correctly mapped the generics to variant parameters
unsafe impl<T> ParametricVariant for HasParam<T>
where
T: 'static + Send + Sync + ConstructType,
{
impl_variant_parameters!(T);
}
julia_module! {
become julia_module_tutorial_init_fn;
for T in [f32, f64] {
struct HasParam<T>;
in HasParam<T> fn data(&self) -> isize;
};
type HasParam32 = HasParam<f32>;
in HasParam<f32> fn new(data: isize) -> CCallRefRet<HasParam<f32>> as HasParam32;
type HasParam64 = HasParam<f64>;
in HasParam<f64> fn new(data: isize) -> CCallRefRet<HasParam<f64>> as HasParam64;
}
julia> module JuliaModuleTutorial ... end
Main.JuliaModuleTutorial
julia> d = JuliaModuleTutorial.HasParam32(1)
Main.JuliaModuleTutorial.HasParam{Float32}()
julia> JuliaModuleTutorial.data(d)
1
julia> d = JuliaModuleTutorial.HasParam64(2)
Main.JuliaModuleTutorial.HasParam{Float64}()
julia> JuliaModuleTutorial.data(d)
2