@@ -17,10 +17,14 @@ macro_rules! trace_tuple {
17
17
{ $single_param: ident } => {
18
18
trace_tuple_impl!( ) ;
19
19
trace_tuple_impl!( $single_param) ;
20
+ #[ cfg( feature = "serde1" ) ]
21
+ deser_tuple_impl!( $single_param) ;
20
22
} ;
21
23
{ $first_param: ident, $( $param: ident) ,* } => {
22
24
trace_tuple! { $( $param) ,* }
23
25
trace_tuple_impl!( $first_param, $( $param) ,* ) ;
26
+ #[ cfg( feature = "serde1" ) ]
27
+ deser_tuple_impl!( $first_param, $( $param) ,* ) ;
24
28
} ;
25
29
}
26
30
@@ -104,6 +108,60 @@ macro_rules! trace_tuple_impl {
104
108
} ;
105
109
}
106
110
111
+ #[ cfg( feature = "serde1" ) ]
112
+ macro_rules! deser_tuple_impl {
113
+ ( $( $param: ident) ,+ ) => {
114
+
115
+ impl <' gc, ' de, Id : $crate:: CollectorId , $( $param) ,* > $crate:: serde:: GcDeserialize <' gc, ' de, Id > for ( $( $param, ) * )
116
+ where $( $param: $crate:: serde:: GcDeserialize <' gc, ' de, Id >) ,* {
117
+ #[ allow( non_snake_case, unused) ]
118
+ fn deserialize_gc<Deser : serde:: Deserializer <' de>>(
119
+ ctx: & ' gc <<Id as $crate:: CollectorId >:: System as $crate:: GcSystem >:: Context ,
120
+ deser: Deser
121
+ ) -> Result <Self , <Deser as serde:: Deserializer <' de>>:: Error > {
122
+ use serde:: de:: { Visitor , Error , SeqAccess } ;
123
+ use std:: marker:: PhantomData ;
124
+ use $crate:: { CollectorId , GcSystem } ;
125
+ struct TupleVisitor <' gc, ' de, Id : $crate:: CollectorId , $( $param: $crate:: serde:: GcDeserialize <' gc, ' de, Id >) ,* > {
126
+ ctx: & ' gc <Id :: System as GcSystem >:: Context ,
127
+ marker: PhantomData <( & ' de ( ) , ( $( $param, ) * ) ) >
128
+ }
129
+ impl <' gc, ' de, Id : CollectorId , $( $param: $crate:: serde:: GcDeserialize <' gc, ' de, Id >) ,* >
130
+ Visitor <' de> for TupleVisitor <' gc, ' de, Id , $( $param) ,* > {
131
+ type Value = ( $( $param, ) * ) ;
132
+ fn expecting( & self , f: & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
133
+ let mut count = 0 ;
134
+ $(
135
+ let $param = ( ) ;
136
+ count += 1 ;
137
+ ) *
138
+ write!( f, "a tuple of len {}" , count)
139
+ }
140
+ fn visit_seq<SeqAcc : SeqAccess <' de>>( self , mut seq: SeqAcc ) -> Result <Self :: Value , SeqAcc :: Error > {
141
+ let mut idx = 0 ;
142
+ $(
143
+ let $param = match seq. next_element_seed( $crate:: serde:: GcDeserializeSeed :: new( self . ctx) ) ? {
144
+ Some ( value) => value,
145
+ None => return Err ( Error :: invalid_length( idx, & self ) )
146
+ } ;
147
+ idx += 1 ;
148
+ ) *
149
+ Ok ( ( $( $param, ) * ) )
150
+ }
151
+ }
152
+ let mut len = 0 ;
153
+ $(
154
+ let _hack = PhantomData :: <$param>;
155
+ len += 1 ;
156
+ ) *
157
+ Ok ( deser. deserialize_tuple( len, TupleVisitor {
158
+ marker: PhantomData , ctx
159
+ } ) ?)
160
+ }
161
+ }
162
+ } ;
163
+ }
164
+
107
165
unsafe_trace_primitive ! ( i8 ) ;
108
166
unsafe_trace_primitive ! ( i16 ) ;
109
167
unsafe_trace_primitive ! ( i32 ) ;
0 commit comments