fory_core/serializer/
refcell.rs1use crate::context::{ReadContext, WriteContext};
36use crate::error::Error;
37use crate::resolver::RefMode;
38use crate::resolver::{TypeInfo, TypeResolver};
39use crate::serializer::{ForyDefault, Serializer};
40use crate::type_id::TypeId;
41use std::cell::RefCell;
42use std::rc::Rc;
43
44impl<T: Serializer + ForyDefault> Serializer for RefCell<T> {
49 #[inline(always)]
50 fn fory_read(
51 context: &mut ReadContext,
52 ref_mode: RefMode,
53 read_type_info: bool,
54 ) -> Result<Self, Error>
55 where
56 Self: Sized + ForyDefault,
57 {
58 Ok(RefCell::new(T::fory_read(
59 context,
60 ref_mode,
61 read_type_info,
62 )?))
63 }
64
65 #[inline(always)]
66 fn fory_read_with_type_info(
67 context: &mut ReadContext,
68 ref_mode: RefMode,
69 type_info: Rc<TypeInfo>,
70 ) -> Result<Self, Error>
71 where
72 Self: Sized + ForyDefault,
73 {
74 Ok(RefCell::new(T::fory_read_with_type_info(
75 context, ref_mode, type_info,
76 )?))
77 }
78
79 #[inline(always)]
80 fn fory_read_data(context: &mut ReadContext) -> Result<Self, Error> {
81 Ok(RefCell::new(T::fory_read_data(context)?))
82 }
83
84 #[inline(always)]
85 fn fory_read_type_info(context: &mut ReadContext) -> Result<(), Error> {
86 T::fory_read_type_info(context)
87 }
88
89 #[inline(always)]
90 fn fory_write(
91 &self,
92 context: &mut WriteContext,
93 ref_mode: RefMode,
94 write_type_info: bool,
95 has_generics: bool,
96 ) -> Result<(), Error> {
97 T::fory_write(
100 &*self.borrow(),
101 context,
102 ref_mode,
103 write_type_info,
104 has_generics,
105 )
106 }
107
108 #[inline(always)]
109 fn fory_write_data_generic(
110 &self,
111 context: &mut WriteContext,
112 has_generics: bool,
113 ) -> Result<(), Error> {
114 T::fory_write_data_generic(&*self.borrow(), context, has_generics)
115 }
116
117 #[inline(always)]
118 fn fory_write_data(&self, context: &mut WriteContext) -> Result<(), Error> {
119 T::fory_write_data(&*self.borrow(), context)
120 }
121
122 #[inline(always)]
123 fn fory_write_type_info(context: &mut WriteContext) -> Result<(), Error> {
124 T::fory_write_type_info(context)
125 }
126
127 #[inline(always)]
128 fn fory_reserved_space() -> usize {
129 T::fory_reserved_space()
131 }
132
133 #[inline(always)]
134 fn fory_get_type_id(type_resolver: &TypeResolver) -> Result<TypeId, Error> {
135 T::fory_get_type_id(type_resolver)
136 }
137
138 #[inline(always)]
139 fn fory_get_type_info(type_resolver: &TypeResolver) -> Result<Rc<TypeInfo>, Error> {
140 T::fory_get_type_info(type_resolver)
141 }
142
143 #[inline(always)]
144 fn fory_type_id_dyn(&self, type_resolver: &TypeResolver) -> Result<TypeId, Error> {
145 (*self.borrow()).fory_type_id_dyn(type_resolver)
146 }
147
148 #[inline(always)]
149 fn fory_static_type_id() -> TypeId
150 where
151 Self: Sized,
152 {
153 T::fory_static_type_id()
154 }
155
156 #[inline(always)]
157 fn fory_is_wrapper_type() -> bool
158 where
159 Self: Sized,
160 {
161 true
162 }
163
164 #[inline(always)]
165 fn as_any(&self) -> &dyn std::any::Any {
166 self
167 }
168}
169
170impl<T: ForyDefault> ForyDefault for RefCell<T> {
171 fn fory_default() -> Self {
172 RefCell::new(T::fory_default())
173 }
174}