1use nalgebra::{Scalar, Vector3, Matrix3};
2
3
4pub trait PackInt {
6 fn size() -> usize;
8
9 fn pack_int_to(&self, buffer: &mut [i32]);
13}
14
15pub trait PackFloat {
17 fn size() -> usize;
19
20 fn pack_float_to(&self, buffer: &mut [f32]);
24}
25
26pub trait Pack {
28 fn size_int() -> usize;
30
31 fn size_float() -> usize;
33
34 fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]);
38}
39
40pub trait PackerInt {
41 fn pack<T: PackInt>(self, t: &T) -> Self;
42}
43impl<'a> PackerInt for &'a mut [i32] {
44 fn pack<T: PackInt>(self, t: &T) -> Self {
45 t.pack_int_to(self);
46 &mut self[T::size()..]
47 }
48}
49
50pub trait PackerFloat {
51 fn pack<T: PackFloat>(self, t: &T) -> Self;
52}
53impl<'a> PackerFloat for &'a mut [f32] {
54 fn pack<T: PackFloat>(self, t: &T) -> Self {
55 t.pack_float_to(self);
56 &mut self[T::size()..]
57 }
58}
59
60pub struct Packer<'a> {
61 buffer_int: &'a mut [i32],
62 buffer_float: &'a mut [f32],
63}
64impl<'a> Packer<'a> {
65 pub fn new(buffer_int: &'a mut [i32], buffer_float: &'a mut [f32]) -> Self {
66 Self { buffer_int, buffer_float }
67 }
68 pub fn pack<T: Pack>(self, t: &T) -> Self {
69 t.pack_to(self.buffer_int, self.buffer_float);
70 Self {
71 buffer_int: &mut self.buffer_int[T::size_int()..],
72 buffer_float: &mut self.buffer_float[T::size_float()..],
73 }
74 }
75}
76
77
78impl PackInt for i32 {
79 fn size() -> usize { 1 }
80 fn pack_int_to(&self, buffer: &mut [i32]) {
81 buffer[0] = *self;
82 }
83}
84impl Pack for i32 {
85 fn size_int() -> usize { 1 }
86 fn size_float() -> usize { 0 }
87 fn pack_to(&self, buffer_int: &mut [i32], _buffer_float: &mut [f32]) {
88 buffer_int[0] = *self;
89 }
90}
91impl PackInt for u32 {
92 fn size() -> usize { 1 }
93 fn pack_int_to(&self, buffer: &mut [i32]) {
94 buffer[0] = *self as i32;
95 }
96}
97impl Pack for u32 {
98 fn size_int() -> usize { 1 }
99 fn size_float() -> usize { 0 }
100 fn pack_to(&self, buffer_int: &mut [i32], _buffer_float: &mut [f32]) {
101 buffer_int[0] = *self as i32;
102 }
103}
104
105impl PackFloat for f32 {
106 fn size() -> usize { 1 }
107 fn pack_float_to(&self, buffer: &mut [f32]) {
108 buffer[0] = *self;
109 }
110}
111impl Pack for f32 {
112 fn size_int() -> usize { 0 }
113 fn size_float() -> usize { 1 }
114 fn pack_to(&self, _buffer_int: &mut [i32], buffer_float: &mut [f32]) {
115 buffer_float[0] = *self;
116 }
117}
118impl PackFloat for f64 {
119 fn size() -> usize { 1 }
120 fn pack_float_to(&self, buffer: &mut [f32]) {
121 buffer[0] = *self as f32;
122 }
123}
124impl Pack for f64 {
125 fn size_int() -> usize { 0 }
126 fn size_float() -> usize { 1 }
127 fn pack_to(&self, _buffer_int: &mut [i32], buffer_float: &mut [f32]) {
128 buffer_float[0] = *self as f32;
129 }
130}
131
132impl<T: PackFloat + Scalar> PackFloat for Vector3<T> {
133 fn size() -> usize { 3*T::size() }
134 fn pack_float_to(&self, mut buffer: &mut [f32]) {
135 for x in self.as_slice() {
136 buffer = buffer.pack(x);
137 }
138 }
139}
140impl<T: Pack + Scalar> Pack for Vector3<T> {
141 fn size_int() -> usize { 3*T::size_int() }
142 fn size_float() -> usize { 3*T::size_float() }
143 fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]) {
144 let mut packer = Packer::new(buffer_int, buffer_float);
145 for x in self.as_slice() {
146 packer = packer.pack(x);
147 }
148 }
149}
150
151
152impl<T: PackFloat + Scalar> PackFloat for Matrix3<T> {
153 fn size() -> usize { 9*T::size() }
154 fn pack_float_to(&self, mut buffer: &mut [f32]) {
155 for x in self.as_slice() {
156 buffer = buffer.pack(x);
157 }
158 }
159}
160impl<T: Pack + Scalar> Pack for Matrix3<T> {
161 fn size_int() -> usize { 9*T::size_int() }
162 fn size_float() -> usize { 9*T::size_float() }
163 fn pack_to(&self, buffer_int: &mut [i32], buffer_float: &mut [f32]) {
164 let mut packer = Packer::new(buffer_int, buffer_float);
165 for x in self.as_slice() {
166 packer = packer.pack(x);
167 }
168 }
169}