1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
#[macro_use] extern crate quote; extern crate proc_macro; extern crate proc_macro2; extern crate syn; use crate::proc_macro::TokenStream; #[proc_macro_derive(AngleOrd)] pub fn angle_ord_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::cmp::PartialOrd for #name { fn partial_cmp(&self, other: &Self) -> ::std::option::Option<::std::cmp::Ordering> { self.0.partial_cmp(&other.0) } } }).into() } #[proc_macro_derive(AngleValue)] pub fn angle_value_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<f64> for #name { fn into(self) -> f64 { self.value() } } }).into() } #[proc_macro_derive(UnpackAngleValue)] pub fn unpack_angle_value_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<(Sign, f64)> for #name { fn into(self) -> (Sign, f64) { (self.sign(), self.0.abs()) } } }).into() } #[proc_macro_derive(UnpackShortAngle)] pub fn unpack_short_angle_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<(Sign, i32, f64)> for #name { fn into(self) -> (Sign, i32, f64) { self.0.into() } } }).into() } #[proc_macro_derive(RawShortAngle)] pub fn raw_short_angle_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<(i32, f64)> for #name { fn into(self) -> (i32, f64) { self.0.into() } } }).into() } #[proc_macro_derive(UnpackLongAngle)] pub fn unpack_long_angle_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<(Sign, i32, i32, f64)> for #name { fn into(self) -> (Sign, i32, i32, f64) { self.0.into() } } }).into() } #[proc_macro_derive(RawLongAngle)] pub fn raw_long_angle_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); let name = &ast.ident; (quote! { impl ::std::convert::Into<(i32, i32, f64)> for #name { fn into(self) -> (i32, i32, f64) { self.0.into() } } }).into() }