1
+ use arrayvec:: { ArrayVec , ArrayString } ;
2
+
3
+ use crate :: { GcRebrand , NullTrace } ;
4
+
5
+ use zerogc_derive:: unsafe_gc_impl;
6
+
7
+ unsafe_gc_impl ! (
8
+ target => ArrayString <SIZE >,
9
+ params => [ const SIZE : usize ] ,
10
+ null_trace => always,
11
+ NEEDS_TRACE => false ,
12
+ NEEDS_DROP => false ,
13
+ branded_type => ArrayString <SIZE >,
14
+ trace_template => |self , visitor| { Ok ( ( ) ) } ,
15
+ deserialize => delegate
16
+ ) ;
17
+
18
+ unsafe_gc_impl ! (
19
+ target => ArrayVec <T , SIZE >,
20
+ params => [ T , const SIZE : usize ] ,
21
+ null_trace => { where T : NullTrace } ,
22
+ NEEDS_TRACE => <T as Trace >:: NEEDS_TRACE ,
23
+ NEEDS_DROP => <T as Trace >:: NEEDS_DROP ,
24
+ bounds => {
25
+ GcRebrand => { where T : GcRebrand <' new_gc, Id >, T :: Branded : Sized } ,
26
+ } ,
27
+ branded_type => ArrayVec <T :: Branded , SIZE >,
28
+ trace_template => |self , visitor| {
29
+ for val in self . #iter( ) {
30
+ visitor. #trace_func( val) ?;
31
+ }
32
+ Ok ( ( ) )
33
+ } ,
34
+ deserialize => |ctx, deserializer| {
35
+ use core:: marker:: PhantomData ;
36
+ use crate :: { CollectorId , GcSystem } ;
37
+ use crate :: serde:: { GcDeserialize , GcDeserializeSeed } ;
38
+ use serde:: de:: { Visitor , Error , SeqAccess } ;
39
+ struct ArrayVecVisitor <
40
+ ' gc, ' de, Id : CollectorId ,
41
+ T : GcDeserialize <' gc, ' de, Id >,
42
+ const SIZE : usize
43
+ > {
44
+ ctx: & ' gc <Id :: System as GcSystem >:: Context ,
45
+ marker: PhantomData <fn ( & ' de ( ) ) -> ArrayVec <T , SIZE >>
46
+ }
47
+ impl <
48
+ ' gc, ' de, Id : CollectorId ,
49
+ T : GcDeserialize <' gc, ' de, Id >,
50
+ const SIZE : usize
51
+ > Visitor <' de> for ArrayVecVisitor <' gc, ' de, Id , T , SIZE > {
52
+ type Value = ArrayVec <T , SIZE >;
53
+ fn expecting( & self , f: & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
54
+ write!( f, "a array with size <= {}" , SIZE )
55
+ }
56
+ #[ inline]
57
+ fn visit_seq<A >( self , mut access: A ) -> Result <Self :: Value , A :: Error >
58
+ where A : SeqAccess <' de>, {
59
+ let mut values = Self :: Value :: new( ) ;
60
+ while let Some ( value) = access. next_element_seed(
61
+ GcDeserializeSeed :: new( self . ctx)
62
+ ) ? {
63
+ match values. try_push( value) {
64
+ Ok ( ( ) ) => { } ,
65
+ Err ( _) => {
66
+ return Err ( A :: Error :: invalid_length( SIZE + 1 , & self ) )
67
+ }
68
+ }
69
+ }
70
+ Ok ( values)
71
+ }
72
+ }
73
+ let visitor: ArrayVecVisitor <Id , T , SIZE > = ArrayVecVisitor { ctx, marker: PhantomData } ;
74
+ deserializer. deserialize_seq( visitor)
75
+ }
76
+ ) ;
0 commit comments