]>
git.proxmox.com Git - rustc.git/blob - vendor/chalk-ir-0.80.0/src/fold/boring_impls.rs
1 //! This module contains "rote and uninteresting" impls of `Fold` for
2 //! various types. In general, we prefer to derive `Fold`, but
3 //! sometimes that doesn't work for whatever reason.
5 //! The more interesting impls of `Fold` remain in the `fold` module.
9 use std
::marker
::PhantomData
;
11 impl<T
: Fold
<I
>, I
: Interner
> Fold
<I
> for Vec
<T
> {
12 type Result
= Vec
<T
::Result
>;
15 folder
: &mut dyn Folder
<I
, Error
= E
>,
16 outer_binder
: DebruijnIndex
,
17 ) -> Result
<Self::Result
, E
> {
18 in_place
::fallible_map_vec(self, |e
| e
.fold_with(folder
, outer_binder
))
22 impl<T
: Fold
<I
>, I
: Interner
> Fold
<I
> for Box
<T
> {
23 type Result
= Box
<T
::Result
>;
26 folder
: &mut dyn Folder
<I
, Error
= E
>,
27 outer_binder
: DebruijnIndex
,
28 ) -> Result
<Self::Result
, E
> {
29 in_place
::fallible_map_box(self, |e
| e
.fold_with(folder
, outer_binder
))
33 macro_rules
! tuple_fold
{
35 impl<$
($n
: Fold
<I
>,)* I
: Interner
> Fold
<I
> for ($
($n
,)*) {
36 type Result
= ($
($n
::Result
,)*);
37 fn fold_with
<Error
>(self, folder
: &mut dyn Folder
<I
, Error
= Error
>, outer_binder
: DebruijnIndex
) -> Result
<Self::Result
, Error
>
39 #[allow(non_snake_case)]
41 Ok(($
($n
.fold_with(folder
, outer_binder
)?
,)*))
49 tuple_fold
!(A
, B
, C
, D
);
50 tuple_fold
!(A
, B
, C
, D
, E
);
52 impl<T
: Fold
<I
>, I
: Interner
> Fold
<I
> for Option
<T
> {
53 type Result
= Option
<T
::Result
>;
56 folder
: &mut dyn Folder
<I
, Error
= E
>,
57 outer_binder
: DebruijnIndex
,
58 ) -> Result
<Self::Result
, E
> {
61 Some(e
) => Ok(Some(e
.fold_with(folder
, outer_binder
)?
)),
66 impl<I
: Interner
> Fold
<I
> for GenericArg
<I
> {
67 type Result
= GenericArg
<I
>;
70 folder
: &mut dyn Folder
<I
, Error
= E
>,
71 outer_binder
: DebruijnIndex
,
72 ) -> Result
<Self::Result
, E
> {
73 let interner
= folder
.interner();
78 .fold_with(folder
, outer_binder
)?
;
79 Ok(GenericArg
::new(interner
, data
))
83 impl<I
: Interner
> Fold
<I
> for Substitution
<I
> {
84 type Result
= Substitution
<I
>;
87 folder
: &mut dyn Folder
<I
, Error
= E
>,
88 outer_binder
: DebruijnIndex
,
89 ) -> Result
<Self::Result
, E
> {
90 let interner
= folder
.interner();
95 .map(|p
| p
.fold_with(folder
, outer_binder
));
96 Substitution
::from_fallible(interner
, folded
)
100 impl<I
: Interner
> Fold
<I
> for Goals
<I
> {
101 type Result
= Goals
<I
>;
104 folder
: &mut dyn Folder
<I
, Error
= E
>,
105 outer_binder
: DebruijnIndex
,
106 ) -> Result
<Self::Result
, E
> {
107 let interner
= folder
.interner();
111 .map(|p
| p
.fold_with(folder
, outer_binder
));
112 Goals
::from_fallible(interner
, folded
)
116 impl<I
: Interner
> Fold
<I
> for ProgramClauses
<I
> {
117 type Result
= ProgramClauses
<I
>;
120 folder
: &mut dyn Folder
<I
, Error
= E
>,
121 outer_binder
: DebruijnIndex
,
122 ) -> Result
<Self::Result
, E
> {
123 let interner
= folder
.interner();
127 .map(|p
| p
.fold_with(folder
, outer_binder
));
128 ProgramClauses
::from_fallible(interner
, folded
)
132 impl<I
: Interner
> Fold
<I
> for QuantifiedWhereClauses
<I
> {
133 type Result
= QuantifiedWhereClauses
<I
>;
136 folder
: &mut dyn Folder
<I
, Error
= E
>,
137 outer_binder
: DebruijnIndex
,
138 ) -> Result
<Self::Result
, E
> {
139 let interner
= folder
.interner();
143 .map(|p
| p
.fold_with(folder
, outer_binder
));
144 QuantifiedWhereClauses
::from_fallible(interner
, folded
)
148 impl<I
: Interner
> Fold
<I
> for Constraints
<I
> {
149 type Result
= Constraints
<I
>;
152 folder
: &mut dyn Folder
<I
, Error
= E
>,
153 outer_binder
: DebruijnIndex
,
154 ) -> Result
<Self::Result
, E
> {
155 let interner
= folder
.interner();
159 .map(|p
| p
.fold_with(folder
, outer_binder
));
160 Constraints
::from_fallible(interner
, folded
)
166 macro_rules
! copy_fold
{
168 impl<I
: Interner
> $
crate::fold
::Fold
<I
> for $t
{
172 _folder
: &mut dyn ($
crate::fold
::Folder
<I
, Error
= E
>),
173 _outer_binder
: DebruijnIndex
,
174 ) -> ::std
::result
::Result
<Self::Result
, E
> {
183 copy_fold
!(UniverseIndex
);
184 copy_fold
!(PlaceholderIndex
);
185 copy_fold
!(QuantifierKind
);
186 copy_fold
!(DebruijnIndex
);
192 copy_fold
!(ClausePriority
);
193 copy_fold
!(Mutability
);
198 macro_rules
! id_fold
{
200 impl<I
: Interner
> $
crate::fold
::Fold
<I
> for $t
<I
> {
204 _folder
: &mut dyn ($
crate::fold
::Folder
<I
, Error
= E
>),
205 _outer_binder
: DebruijnIndex
,
206 ) -> ::std
::result
::Result
<Self::Result
, E
> {
216 id_fold
!(AssocTypeId
);
217 id_fold
!(OpaqueTyId
);
220 id_fold
!(GeneratorId
);
221 id_fold
!(ForeignDefId
);
223 impl<I
: Interner
> SuperFold
<I
> for ProgramClauseData
<I
> {
224 fn super_fold_with
<E
>(
226 folder
: &mut dyn Folder
<I
, Error
= E
>,
227 outer_binder
: DebruijnIndex
,
228 ) -> ::std
::result
::Result
<Self::Result
, E
> {
229 Ok(ProgramClauseData(self.0.fold_with
(folder
, outer_binder
)?
))
233 impl<I
: Interner
> SuperFold
<I
> for ProgramClause
<I
> {
234 fn super_fold_with
<E
>(
236 folder
: &mut dyn Folder
<I
, Error
= E
>,
237 outer_binder
: DebruijnIndex
,
238 ) -> ::std
::result
::Result
<Self::Result
, E
> {
239 let clause
= self.data(folder
.interner()).clone();
241 .super_fold_with(folder
, outer_binder
)?
242 .intern(folder
.interner()))
246 impl<I
: Interner
> Fold
<I
> for PhantomData
<I
> {
247 type Result
= PhantomData
<I
>;
251 _folder
: &mut dyn Folder
<I
, Error
= E
>,
252 _outer_binder
: DebruijnIndex
,
253 ) -> ::std
::result
::Result
<Self::Result
, E
> {