1extern crate itertools;
2extern crate num_integer;
3extern crate num_traits;
4
5use std::fmt;
6use std::iter;
7use std::i16;
8
9use itertools::Itertools;
10use num_traits::{Float, NumCast, PrimInt};
11
12#[derive(Debug)]
13pub enum RdirError {
14 Decode(String),
15 Encode(String),
16}
17
18impl fmt::Display for RdirError {
19 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20 match *self {
21 RdirError::Decode(ref err) => write!(f, "Decode error: {}", err),
22 RdirError::Encode(ref err) => write!(f, "Encode error: {}", err),
23 }
24 }
25}
26
27#[derive(Debug)]
47pub struct RunLength;
48
49impl RunLength {
50 pub fn decode<T>(values: &[T]) -> Result<Vec<i32>, RdirError>
51 where
52 T: num_integer::Integer + NumCast + PrimInt,
53 {
54 let mut res: Vec<i32> = Vec::new();
55
56 if !values.len() % 2 == 0 {
57 return Err(RdirError::Decode("Run Length error".to_string()));
58 }
59
60 for v in values.chunks(2) {
61 let value = &v[0];
62 let repeat = &v[1];
63 let chunks: usize = NumCast::from(*repeat).unwrap();
64 for i in iter::repeat(value).take(chunks) {
65 let value: i32 = NumCast::from(*i).unwrap();
66 res.push(value);
67 }
68 }
69 Ok(res)
70 }
71
72 pub fn encode<T>(values: &[T]) -> Result<Vec<i32>, RdirError>
74 where
75 T: num_integer::Integer + NumCast + PrimInt,
76 {
77 let mut result: Vec<i32> = Vec::new();
78
79 for (key, group) in &values.into_iter().group_by(|v| *v) {
80 let key: i32 = NumCast::from(*key).unwrap();
81 result.push(key);
82 result.push(group.count() as i32);
83 }
84 Ok(result)
85 }
86}
87
88#[derive(Debug)]
110pub struct Delta;
111
112impl Delta {
113 pub fn decode(values: &[i32]) -> Result<Vec<i32>, RdirError> {
115 let mut buffer = Vec::with_capacity(values.len() as usize);
116
117 buffer.push(values[0]);
119
120 for (index, value) in values.iter().skip(1).enumerate() {
121 let position = buffer[index];
122 buffer.push(position + value)
123 }
124 Ok(buffer)
125 }
126
127 pub fn encode<T>(values: &[T]) -> Result<Vec<i32>, RdirError>
129 where
130 T: num_integer::Integer + NumCast + PrimInt,
131 {
132 if values.len() <= 1 {
133 let err = format!(
134 "Delta::encode() error: values length should be greater than {}",
135 values.len()
136 );
137 return Err(RdirError::Encode(err));
138 }
139
140 let mut buffer: Vec<i32> = Vec::with_capacity(values.len() as usize);
141
142 let mut position = NumCast::from(values[0]).unwrap();
143 buffer.push(position);
144 for (_, value) in values.iter().skip(1).enumerate() {
145 let value: i32 = NumCast::from(*value).unwrap();
146 buffer.push(value - position);
147 position = value;
148 }
149 Ok(buffer)
150 }
151}
152
153#[derive(Debug)]
174pub struct IntegerEncoding;
175
176impl IntegerEncoding {
177 pub fn decode<T>(values: &[T], factor: i32) -> Result<Vec<f32>, RdirError>
179 where
180 T: num_integer::Integer + NumCast + PrimInt,
181 {
182 let result: Vec<f32> = values
183 .iter()
184 .map(|x| {
185 let value: f32 = NumCast::from(*x).unwrap();
186 value / factor as f32
187 })
188 .collect();
189 Ok(result)
190 }
191
192 pub fn encode<T>(values: &[T], factor: i32) -> Result<Vec<i32>, RdirError>
194 where
195 T: Float,
196 {
197 let result: Vec<i32> = values
198 .iter()
199 .map(|x| {
200 let x: T = NumCast::from(*x).unwrap();
201 let factor: T = NumCast::from(factor).unwrap();
202 let result: i32 = NumCast::from(x * factor).unwrap();
203 result
204 })
205 .collect();
206 Ok(result)
207 }
208}
209
210#[derive(Debug)]
238pub struct RecursiveIndexing;
239
240impl RecursiveIndexing {
241 pub fn decode<T>(values: &[T]) -> Result<Vec<i32>, RdirError>
243 where
244 T: num_integer::Integer + NumCast + PrimInt,
245 {
246 let mut output = Vec::new();
247 let mut out_len: i32 = 0;
248
249 let max: i32 = NumCast::from(i16::MAX).unwrap();
250 let min: i32 = NumCast::from(i16::MIN).unwrap();
251
252 for item in values {
253 let item: i32 = NumCast::from(*item).unwrap();
254
255 if item == max || item == min {
256 out_len += item;
257 } else {
258 out_len += item;
259 output.push(out_len);
260 out_len = 0;
261 }
262 }
263 Ok(output)
264 }
265
266 pub fn encode(values: &[i32]) -> Result<Vec<i16>, RdirError> {
268 let mut output: Vec<i16> = Vec::new();
269
270 let max: i32 = NumCast::from(i16::MAX).unwrap();
271 let min: i32 = NumCast::from(i16::MIN).unwrap();
272
273 for num in values {
274 let mut num = *num;
275 if num >= 0 {
276 while num >= max {
277 output.push(NumCast::from(max).unwrap());
278 num -= max;
279 }
280 } else {
281 while num <= min {
282 output.push(NumCast::from(min).unwrap());
283 num += min.abs();
284 }
285 }
286 output.push(NumCast::from(num).unwrap());
287 }
288 Ok(output)
289 }
290}
291
292#[cfg(test)]
293mod tests {
294 use super::*;
295
296 #[test]
297 fn it_decode_run_length_encoding() {
298 let encoded = [1, 4, 2, 1, 1, 4];
299 let decoded = RunLength::decode(&encoded).unwrap();
300 assert_eq!(vec![1, 1, 1, 1, 2, 1, 1, 1, 1], decoded);
301
302 let decoded = RunLength::decode(&encoded).unwrap();
303 assert_eq!(vec![1, 1, 1, 1, 2, 1, 1, 1, 1], decoded);
304 }
305
306 #[test]
307 fn it_encode_run_length_encoding() {
308 let encoded = [1, 1, 1, 1, 2, 1, 1, 1, 1];
309 let decoded = RunLength::encode(&encoded).unwrap();
310 assert_eq!(vec![1, 4, 2, 1, 1, 4], decoded);
311 }
312
313 #[test]
314 fn it_decode_delta_encoding() {
315 let data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 5];
316 let expected = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 20];
317 let actual = Delta::decode(&data).unwrap();
318 assert_eq!(expected, actual);
319 }
320
321 #[test]
322 fn it_encode_delta_encoding() {
323 let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 20];
324 let expected = vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 5];
325 let actual = Delta::encode(&data).unwrap();
326 assert_eq!(expected, actual);
327 }
328
329 #[test]
330 fn it_decode_integer_decoding() {
331 let data = [100, 100, 100, 100, 50, 50];
332 let expected = vec![1.00, 1.00, 1.00, 1.00, 0.50, 0.50];
333 let actual = IntegerEncoding::decode(&data, 100).unwrap();
334 assert_eq!(expected, actual);
335
336 let data = [100_i16, 100, 100, 100, 50, 50];
337 let expected = vec![1.00, 1.00, 1.00, 1.00, 0.50, 0.50];
338 let actual = IntegerEncoding::decode(&data, 100).unwrap();
339 assert_eq!(expected, actual);
340 }
341
342 #[test]
343 fn it_encode_integer_encoding() {
344 let data = [1.00, 1.00, 1.00, 1.00, 0.50, 0.50];
345 let expected = vec![100, 100, 100, 100, 50, 50];
346 let actual = IntegerEncoding::encode(&data, 100).unwrap();
347 assert_eq!(expected, actual);
348 }
349
350 #[test]
351 fn it_decode_recursive_index_encoding() {
352 let data = [1, 420, 32767, 0, 120, -32768, 0, 32767, 2];
353 let expected = vec![1, 420, 32767, 120, -32768, 32769];
354 let actual = RecursiveIndexing::decode(&data).unwrap();
355 assert_eq!(expected, actual);
356 }
357
358 #[test]
359 fn it_encode_recursive_index_encoding() {
360 let data = [1, 420, 32767, 120, -32768, 32769];
361 let expected = vec![1, 420, 32767, 0, 120, -32768, 0, 32767, 2];
362 let actual = RecursiveIndexing::encode(&data).unwrap();
363 assert_eq!(expected, actual);
364 }
365}