Skip to main content

depends/execution/dependency/
impls.rs

1use crate::{
2    error::ResolveResult, Dependency, DependencyEdge, HashValue, IsDirty, Named, NodeRef, Resolve,
3    Visitor,
4};
5
6macro_rules! generate_dependencies {
7    ($count:expr, $($param:expr),*) => {
8        paste::paste! {
9            pub struct [<Dependencies $count>]<$([<T $param >]),*> (
10                $(Dependency<[<T $param >]>,)*
11            );
12
13            impl<$([<T $param >]),*> Named for [<Dependencies $count>]<$([<T $param >]),*> {
14                fn name() -> &'static str {
15                     stringify!([<Dependencies $count>])
16                }
17            }
18
19            impl<$([<T $param >]),*> [<Dependencies $count>]<$([<T $param >]),*>
20            where
21                $([<T $param >]: Resolve,)*
22                $(for<'a> <[<T $param >] as Resolve>::Output<'a>: HashValue,)*
23            {
24                #[allow(clippy::too_many_arguments)]
25                pub fn new($([<t $param >]: [<T $param >]),*) -> Self {
26                    Self (
27                        $(Dependency::new([<t $param >])),*
28                    )
29                }
30            }
31
32            pub struct [<DependencyReference $count>]<'a, $([<T $param >]),*> (
33                $(pub DependencyEdge<'a, [<T $param >]>,)*
34            );
35
36            pub type [<DepRef $count>]<'a, $([<T $param >]),*> = [<DependencyReference $count>]<'a, $(NodeRef<'a, [<T $param >]>),*>;
37
38            impl<$([<T $param >]),*> IsDirty for [<DependencyReference $count>]<'_, $([<T $param >]),*> {
39                fn is_dirty(&self) -> bool {
40                    $(self.[< $param >].is_dirty() )||*
41                }
42            }
43
44            impl<$([<T $param >]),*> Resolve for [<Dependencies $count>]<$([<T $param >]),*>
45            where
46                $([<T $param >]: Resolve,)*
47                $(for<'a> <[<T $param >] as Resolve>::Output<'a>: HashValue,)*
48            {
49                type Output<'a> = [<DependencyReference $count>]<'a, $([<T $param >]::Output<'a>),*>
50                where
51                    Self: 'a;
52
53                fn resolve(&self, visitor: &mut impl Visitor) -> ResolveResult<Self::Output<'_>> {
54                    visitor.touch_dependency_group(Self::name());
55                    Ok([<DependencyReference $count>] (
56                        $(self.[< $param >].resolve(visitor)?),*
57                    ))
58                }
59            }
60        }
61    };
62}
63
64generate_dependencies!(2, 0, 1);
65generate_dependencies!(3, 0, 1, 2);
66generate_dependencies!(4, 0, 1, 2, 3);
67generate_dependencies!(5, 0, 1, 2, 3, 4);
68generate_dependencies!(6, 0, 1, 2, 3, 4, 5);
69generate_dependencies!(7, 0, 1, 2, 3, 4, 5, 6);
70generate_dependencies!(8, 0, 1, 2, 3, 4, 5, 6, 7);
71generate_dependencies!(9, 0, 1, 2, 3, 4, 5, 6, 7, 8);
72generate_dependencies!(10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
73generate_dependencies!(11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
74generate_dependencies!(12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
75generate_dependencies!(13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
76generate_dependencies!(14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
77generate_dependencies!(15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
78generate_dependencies!(16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);