blob: 5cb584d6021d13aee2b16ac60dd459d49a772123 [file] [log] [blame]
Austin Schuh272c6132020-11-14 16:37:52 -08001// Copyright 2019 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use crate::builder::Builder;
16use crate::private::Sealed;
James Kuszmaul8e62b022022-03-22 09:33:25 -070017use crate::{Blob, Buffer, IndirectFloat, IndirectInt, IndirectUInt};
Austin Schuh272c6132020-11-14 16:37:52 -080018
James Kuszmaul8e62b022022-03-22 09:33:25 -070019impl<B: Buffer> Sealed for Blob<B> {}
Austin Schuh272c6132020-11-14 16:37:52 -080020impl Sealed for () {}
21
22// TODO: String interning
23// TODO: Pushable for Map types?
24
25/// Types that implement the Pushable trait can be written into a Flexbuffer.
26///
27/// All Rust's standard numbers, `u8, u16, u32, u64, i8, i16, i32, i64, f32, f64`,
28/// can all be pushed. They are `FlexBufferType::{UInt, Int, Float}`.
29/// Flexbuffers chooses the smallest width that can represent the given number.
30/// Strings can pe pushed, they become `FlexBufferType::String` and are stored
31/// with both a length and null terminator.
32///
33/// * For convenience and speed push typed vectors using rust arrays and slices.
34/// Doing so will immediately serialize the data, skipping the `Builder`'s
35/// internal cache.
36///
37/// * Pushable cannot not be implemented by any downstream crates.
38pub trait Pushable: Sealed + Sized {
39 fn push_to_builder(self, _: &mut Builder) {}
40}
41
42impl Pushable for () {
43 fn push_to_builder(self, builder: &mut Builder) {
44 builder.push_null();
45 }
46}
James Kuszmaul8e62b022022-03-22 09:33:25 -070047
48impl<B: Buffer> Pushable for Blob<B> {
Austin Schuh272c6132020-11-14 16:37:52 -080049 fn push_to_builder(self, builder: &mut Builder) {
James Kuszmaul8e62b022022-03-22 09:33:25 -070050 builder.push_blob(&self.0);
Austin Schuh272c6132020-11-14 16:37:52 -080051 }
52}
53
54macro_rules! forward_to_builder {
55 ($T: ty, $method: ident) => {
56 impl Sealed for $T {}
57 impl Pushable for $T {
58 fn push_to_builder(self, builder: &mut Builder) {
59 builder.$method(self);
60 }
61 }
62 };
63 ($T: ty, $method: ident, $asT: ty) => {
64 impl Sealed for $T {}
65 impl Pushable for $T {
66 fn push_to_builder(self, builder: &mut Builder) {
67 builder.$method(self as $asT);
68 }
69 }
70 };
71}
72forward_to_builder!(&str, push_str);
73forward_to_builder!(bool, push_bool);
74forward_to_builder!(u8, push_uint);
75forward_to_builder!(u16, push_uint);
76forward_to_builder!(u32, push_uint);
77forward_to_builder!(u64, push_uint);
78forward_to_builder!(i8, push_int);
79forward_to_builder!(i16, push_int);
80forward_to_builder!(i32, push_int);
81forward_to_builder!(i64, push_int);
82forward_to_builder!(f32, push_float);
83forward_to_builder!(f64, push_float);
84forward_to_builder!(&[u8], push_uints);
85forward_to_builder!(&[u16], push_uints);
86forward_to_builder!(&[u32], push_uints);
87forward_to_builder!(&[u64], push_uints);
88forward_to_builder!(&[i8], push_ints);
89forward_to_builder!(&[i16], push_ints);
90forward_to_builder!(&[i32], push_ints);
91forward_to_builder!(&[i64], push_ints);
92forward_to_builder!(&[f32], push_floats);
93forward_to_builder!(&[f64], push_floats);
94forward_to_builder!(&[bool], push_bools);
95forward_to_builder!(&Vec<u8>, push_uints);
96forward_to_builder!(&Vec<u16>, push_uints);
97forward_to_builder!(&Vec<u32>, push_uints);
98forward_to_builder!(&Vec<u64>, push_uints);
99forward_to_builder!(&Vec<i8>, push_ints);
100forward_to_builder!(&Vec<i16>, push_ints);
101forward_to_builder!(&Vec<i32>, push_ints);
102forward_to_builder!(&Vec<i64>, push_ints);
103forward_to_builder!(&Vec<f32>, push_floats);
104forward_to_builder!(&Vec<f64>, push_floats);
105forward_to_builder!(&Vec<bool>, push_bools);
106
107macro_rules! impl_indirects {
108 ($Indirect: ident, $method: ident) => {
109 impl Sealed for $Indirect {}
110 impl Pushable for $Indirect {
111 fn push_to_builder(self, builder: &mut Builder) {
112 builder.$method(self.0);
113 }
114 }
115 };
116}
117impl_indirects!(IndirectInt, push_indirect_int);
118impl_indirects!(IndirectUInt, push_indirect_uint);
119impl_indirects!(IndirectFloat, push_indirect_float);
120
121macro_rules! impl_arrays {
122 ($num: expr) => {
123 forward_to_builder!(&[u8; $num], push_uints, &[u8]);
124 forward_to_builder!(&[u16; $num], push_uints, &[u16]);
125 forward_to_builder!(&[u32; $num], push_uints, &[u32]);
126 forward_to_builder!(&[u64; $num], push_uints, &[u64]);
127 forward_to_builder!(&[i8; $num], push_ints, &[i8]);
128 forward_to_builder!(&[i16; $num], push_ints, &[i16]);
129 forward_to_builder!(&[i32; $num], push_ints, &[i32]);
130 forward_to_builder!(&[i64; $num], push_ints, &[i64]);
131 forward_to_builder!(&[f32; $num], push_floats, &[f32]);
132 forward_to_builder!(&[f64; $num], push_floats, &[f64]);
133 forward_to_builder!(&[bool; $num], push_bools, &[bool]);
134 };
135}
136impl_arrays!(0);
137impl_arrays!(1);
138impl_arrays!(2);
139impl_arrays!(3);
140impl_arrays!(4);
141impl_arrays!(5);
142impl_arrays!(6);
143// impl_arrays!(7);
144// impl_arrays!(8);
145// impl_arrays!(9);
146// impl_arrays!(10);
147// impl_arrays!(11);
148// impl_arrays!(12);
149// impl_arrays!(13);
150// impl_arrays!(14);
151// impl_arrays!(15);
152// impl_arrays!(16);
153// impl_arrays!(17);
154// impl_arrays!(18);
155// impl_arrays!(19);
156// impl_arrays!(20);
157// impl_arrays!(21);
158// impl_arrays!(22);
159// impl_arrays!(23);
160// impl_arrays!(24);
161// impl_arrays!(25);
162// impl_arrays!(26);
163// impl_arrays!(27);
164// impl_arrays!(28);
165// impl_arrays!(29);
166// impl_arrays!(30);
167// impl_arrays!(31);
168// impl_arrays!(32);