1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//! Utilities for swapping bytes using patterns and masks. //! //! # Quick Start //! //! ## Iterators //! //! ``` //! use bswp::pattern::{Pattern, Predicate, swap_iter}; //! //! let pattern = Pattern::new(0x42).with_mask(0xFF); // replace byte by 0x42 //! let predicate = Predicate::new().with_periodicity(2).with_offset(1); // replace odd bytes //! let swaps = &[(pattern, predicate)]; //! //! let source: [u8; 4] = [0x41, 0x41, 0x41, 0x41]; //! let swapped = swap_iter(&source, swaps); // iterator on result //! let swapped: Vec<u8> = swapped.collect(); //! assert_eq!(swapped, vec!(0x41, 0x42, 0x41, 0x42)); //! ``` //! //! ## Mutating File-like Data //! //! ``` //! use std::io::Cursor; //! use bswp::pattern::{Pattern, Predicate}; //! use bswp::io::swap_io; //! //! // in memory reader (implements `Read`) //! let mut reader: Cursor<Vec<u8>> = Cursor::new(vec![0x41, 0x42, 0x43, 0x44]); //! // in memory writer (implements `Write`) //! let mut writer: Cursor<Vec<u8>> = Cursor::new(Vec::new()); //! //! let swaps: &[(Pattern, Predicate)] = &[(Pattern::new(0x42).with_mask(0xFF), Predicate::new().with_periodicity(2).with_offset(0))]; //! let swap = swap_io(&mut reader, &mut writer, swaps); //! assert!(swap.is_ok()); //! assert_eq!(swap.unwrap(), 4); // 4 bytes written //! assert_eq!(writer.into_inner(), vec![0x42, 0x42, 0x42, 0x44]) //! ``` /// default buffer size for io: 8KB pub const BUFFER_SIZE: usize = 8000; // 8KB /// Predicate on byte position. pub trait PositionPredicate { /// Returns `true` if `position` matches predicate else `false`. fn eval(&self, position: usize) -> bool; } /// Pattern on byte. pub trait BytePattern { /// Returns the value with current pattern applied. fn eval(&self, value: u8) -> u8; } pub mod io; pub mod pattern;