Skip to main content

fory_core/serializer/
number.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use 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
105// Custom implementation for float16 (cannot use 0 as float16)
106impl 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);