#[macro_export]
macro_rules! cpp {
() => {};
(#include < $i:ident > $($rest:tt)*) => {cpp!{$($rest)*}};
(#include $l:tt $($rest:tt)*) => {cpp!{$($rest)*}};
(raw $body:tt $($rest:tt)*) => {cpp!{$($rest)*}};
(CPP_PARAM $name:ident : $t:ty as $cppt:tt) => {
$name: $t
};
(CPP_PARAM $name:ident : $t:ty as $cppt:tt , $($rest:tt)*) => {
$name: $t ,
cpp!{CPP_PARAM $($rest)*}
};
($(#[$m:meta])*
fn $id:ident ( $($name:ident : $t:ty as $cppt:tt),* ) -> $rt:ty as $rcppt:tt $body:tt $($rest:tt)*) => {
extern "C" {
$(#[$m])*
fn $id ( $($name : $t),* ) -> $rt ;
}
cpp!{$($rest)*}
};
($(#[$m:meta])*
fn $id:ident ( $($name:ident : $t:ty as $cppt:tt),* ) $body:tt $($rest:tt)*) => {
extern "C" {
$(#[$m])*
fn $id ( $($name : $t),* ) ;
}
cpp!{$($rest)*}
};
($(#[$m:meta])*
struct $id:ident { $($i:ident : $t:ty as $cpp:tt ,)* } $($rest:tt)*) => {
$(#[$m])*
#[repr(C)]
struct $id {
$($i : $t ,)*
}
cpp!{$($rest)*}
};
($(#[$m:meta])*
enum $id:ident { $($i:ident ,)* } $($rest:tt)*) => {
$(#[$m])*
#[repr(C)]
enum $id {
$($i ,)*
}
cpp!{$($rest)*}
};
($(#[$m:meta])*
enum class $id:ident { $($i:ident ,)* } $($rest:tt)*) => {
$(#[$m])*
#[repr(C)]
enum $id {
$($i ,)*
}
cpp!{$($rest)*}
};
($(#[$m:meta])*
enum prefix $id:ident { $($i:ident ,)* } $($rest:tt)*) => {
$(#[$m])*
#[repr(C)]
enum $id {
$($i ,)*
}
cpp!{$($rest)*}
};
}