fory_core/serializer/
number.rs1use crate::float16::float16;
19
20use crate::buffer::{Reader, Writer};
21use crate::error::Error;
22use crate::resolver::context::ReadContext;
23use crate::resolver::context::WriteContext;
24use crate::resolver::type_resolver::TypeResolver;
25use crate::serializer::util::read_basic_type_info;
26use crate::serializer::{ForyDefault, Serializer};
27use crate::types::TypeId;
28
29macro_rules! impl_num_serializer {
30 ($ty:ty, $writer:expr, $reader:expr, $field_type:expr) => {
31 impl Serializer for $ty {
32 #[inline(always)]
33 fn fory_write_data(&self, context: &mut WriteContext) -> Result<(), Error> {
34 $writer(&mut context.writer, *self);
35 Ok(())
36 }
37
38 #[inline(always)]
39 fn fory_read_data(context: &mut ReadContext) -> Result<Self, Error> {
40 $reader(&mut context.reader)
41 }
42
43 #[inline(always)]
44 fn fory_reserved_space() -> usize {
45 std::mem::size_of::<$ty>()
46 }
47
48 #[inline(always)]
49 fn fory_get_type_id(_: &TypeResolver) -> Result<TypeId, Error> {
50 Ok($field_type)
51 }
52
53 #[inline(always)]
54 fn fory_type_id_dyn(&self, _: &TypeResolver) -> Result<TypeId, Error> {
55 Ok($field_type)
56 }
57
58 #[inline(always)]
59 fn fory_static_type_id() -> TypeId {
60 $field_type
61 }
62
63 #[inline(always)]
64 fn as_any(&self) -> &dyn std::any::Any {
65 self
66 }
67
68 #[inline(always)]
69 fn fory_write_type_info(context: &mut WriteContext) -> Result<(), Error> {
70 context.writer.write_var_uint32($field_type as u32);
71 Ok(())
72 }
73
74 #[inline(always)]
75 fn fory_read_type_info(context: &mut ReadContext) -> Result<(), Error> {
76 read_basic_type_info::<Self>(context)
77 }
78 }
79 impl ForyDefault for $ty {
80 #[inline(always)]
81 fn fory_default() -> Self {
82 0 as $ty
83 }
84 }
85 };
86}
87
88impl_num_serializer!(i8, Writer::write_i8, Reader::read_i8, TypeId::INT8);
89impl_num_serializer!(i16, Writer::write_i16, Reader::read_i16, TypeId::INT16);
90impl_num_serializer!(
91 i32,
92 Writer::write_varint32,
93 Reader::read_varint32,
94 TypeId::VARINT32
95);
96impl_num_serializer!(
97 i64,
98 Writer::write_varint64,
99 Reader::read_varint64,
100 TypeId::VARINT64
101);
102impl_num_serializer!(f32, Writer::write_f32, Reader::read_f32, TypeId::FLOAT32);
103impl_num_serializer!(f64, Writer::write_f64, Reader::read_f64, TypeId::FLOAT64);
104
105impl Serializer for float16 {
107 #[inline(always)]
108 fn fory_write_data(&self, context: &mut WriteContext) -> Result<(), Error> {
109 Writer::write_f16(&mut context.writer, *self);
110 Ok(())
111 }
112 #[inline(always)]
113 fn fory_read_data(context: &mut ReadContext) -> Result<Self, Error> {
114 Reader::read_f16(&mut context.reader)
115 }
116 #[inline(always)]
117 fn fory_reserved_space() -> usize {
118 std::mem::size_of::<float16>()
119 }
120 #[inline(always)]
121 fn fory_get_type_id(_: &TypeResolver) -> Result<TypeId, Error> {
122 Ok(TypeId::FLOAT16)
123 }
124 #[inline(always)]
125 fn fory_type_id_dyn(&self, _: &TypeResolver) -> Result<TypeId, Error> {
126 Ok(TypeId::FLOAT16)
127 }
128 #[inline(always)]
129 fn fory_static_type_id() -> TypeId {
130 TypeId::FLOAT16
131 }
132 #[inline(always)]
133 fn as_any(&self) -> &dyn std::any::Any {
134 self
135 }
136 #[inline(always)]
137 fn fory_write_type_info(context: &mut WriteContext) -> Result<(), Error> {
138 context.writer.write_var_uint32(TypeId::FLOAT16 as u32);
139 Ok(())
140 }
141 #[inline(always)]
142 fn fory_read_type_info(context: &mut ReadContext) -> Result<(), Error> {
143 read_basic_type_info::<Self>(context)
144 }
145}
146
147impl ForyDefault for float16 {
148 #[inline(always)]
149 fn fory_default() -> Self {
150 float16::ZERO
151 }
152}
153impl_num_serializer!(i128, Writer::write_i128, Reader::read_i128, TypeId::INT128);
154impl_num_serializer!(
155 isize,
156 Writer::write_isize,
157 Reader::read_isize,
158 TypeId::ISIZE
159);