inc_complete/computation/
macros.rs1#[macro_export]
31macro_rules! define_intermediate {
32 ( $type_name:ident $( { $($fields:tt)* } )? ,
34 $get_function_name:ident, $output_type:ty, $impl_function:expr) => {
35 define_intermediate!(@inner $type_name $( { $( $fields )* } )?, $get_function_name, $output_type, $impl_function; (|x|x); &'db);
36 };
37 ( $type_name:ident $( { $($fields:tt)* } )? ,
39 $get_function_name:ident, cloned $output_type:ty, $impl_function:expr) => {
40 define_intermediate!(@inner $type_name $( { $($fields)* } )?, $get_function_name, $output_type, $impl_function; Clone::clone;);
41 };
42 (@inner $type_name:ident $( { $( $($(@$if_ref:tt)? &)? $field_name:ident : $field_type:ty),* } )? ,
43 $get_function_name:ident, $output_type:ty, $impl_function:expr; $clone_function:expr ; $($output_ref:tt)* ) => {
44
45 $crate::paste::paste! {
46 #[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
47 struct [<$type_name Internal>] { $( $( $field_name : $field_type ),* )? }
48
49 type $type_name = $crate::HashMapStorage<$crate::Intermediate<[<$type_name Internal>]>>;
50
51 #[allow(non_snake_case)]
53 #[allow(unused)]
54 fn $type_name($( $( $field_name : $field_type, )* )?) -> $type_name {
55 $crate::HashMapStorage::new($crate::Intermediate::new([<$type_name Internal>] { $( $( $field_name ),* )? }))
56 }
57
58 #[allow(unused)]
60 fn $get_function_name<'db>($( $( $field_name : $field_type, )* )? db: &'db mut $crate::DbHandle<impl $crate::Computation>) -> $($output_ref)? $output_type {
61 $clone_function(db.get($type_name ( $( $( $field_name ),* )? )))
62 }
63
64 #[allow(unused)]
67 fn [<$get_function_name _db>]<'db>($( $( $field_name : $field_type, )* )? db: &'db mut $crate::Db<impl $crate::Computation>) -> $($output_ref)? $output_type {
68 $clone_function(db.get($type_name ( $( $( $field_name ),* )? )))
69 }
70
71 impl $crate::Run for [<$type_name Internal>] {
72 type Output = $output_type;
73
74 fn run(&self, handle: &mut $crate::DbHandle<impl $crate::Computation>) -> Self::Output {
75 $impl_function($( $( $($($if_ref)? & )? self. $field_name, )*)? handle)
76 }
77 }
78 }
79 };
80}
81
82#[macro_export]
106macro_rules! define_input {
107 ( $type_name:ident $( { $($fields:tt)* } )? ,
109 $get_function_name:ident, $output_type:ty) => {
110 define_input!($type_name $( { $($fields)* } )?, $get_function_name, $output_type; (|x|x); &'db);
111 };
112 ( $type_name:ident $( { $($fields:tt)* } )? ,
114 $get_function_name:ident, cloned $output_type:ty) => {
115 define_input!($type_name $( { $($fields)* } )?, $get_function_name, $output_type; Clone::clone;);
116 };
117
118 ( $type_name:ident $( { $( $field_name:ident : $field_type:ty),* } )? ,
119 $get_function_name:ident, $output_type:ty ; $clone_function:expr ; $($output_ref:tt)* ) => {
120
121 $crate::paste::paste! {
122 #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
123 pub struct [<$type_name Internal>] { $( $( $field_name : $field_type ),* )? }
124
125 pub type $type_name = $crate::HashMapStorage<$crate::Input<[<$type_name Internal>]>>;
126
127 #[allow(non_snake_case)]
129 #[allow(unused)]
130 fn $type_name($( $( $field_name : $field_type, )* )?) -> $type_name {
131 $crate::HashMapStorage::new($crate::Input::new([<$type_name Internal>] { $( $( $field_name ),* )? }))
132 }
133
134 #[allow(unused)]
136 fn $get_function_name<'db>($( $( $field_name : $field_type, )* )? db: &'db mut $crate::DbHandle<impl $crate::Computation>) -> $($output_ref)* $output_type {
137 let result = db.get($type_name ($( $( $field_name ),* )? ));
138 $clone_function(result)
139 }
140
141 #[allow(unused)]
144 fn [<$get_function_name _db>]<'db>($( $( $field_name : $field_type, )* )? db: &'db mut $crate::Db<impl $crate::Computation>) -> $($output_ref)? $output_type {
145 let result = db.get($type_name ($( $( $field_name ),* )? ));
146 $clone_function(result)
147 }
148
149 impl $crate::OutputTypeForInput for [<$type_name Internal>] {
150 type Output = $output_type;
151 }
152 }
153 };
154}