fn byte_fault() -> Fault { &FaultInfo { message: "byte conversion failed", source: "reference.dever", line: 1, column: 1, } } fn total_reference(values: &dever_runtime::Bytes) -> Result { values.iter().try_fold(0i64, |total, value| { total.checked_add(i64::from(*value)).ok_or_else(byte_fault) }) } fn each_reference(values: &dever_runtime::Bytes) -> Result, Fault> { values .iter() .map(|value| i64::from(*value).checked_add(1).ok_or_else(byte_fault)) .collect() } fn encode_generated(values: &[String]) -> Result { GENERATED_ENCODE(values.first().map(String::as_str).unwrap_or("")) } fn encode_reference(values: &[String]) -> Result { Ok(values .first() .map(String::as_str) .unwrap_or("") .as_bytes() .to_vec() .into()) } fn decode_generated(values: &dever_runtime::Bytes) -> Result { GENERATED_DECODE(values).map_err(|_| byte_fault()) } fn decode_reference(values: &dever_runtime::Bytes) -> Result { std::str::from_utf8(values) .map(str::to_owned) .map_err(|_| byte_fault()) } fn convert_generated(values: &[i64]) -> Result { GENERATED_CONVERT(values).map_err(|_| byte_fault()) } fn convert_reference(values: &[i64]) -> Result { values .iter() .map(|value| u8::try_from(*value).map_err(|_| byte_fault())) .collect::, _>>() .map(Into::into) } fn slice_generated(values: &dever_runtime::Bytes) -> Result { GENERATED_SLICE(values).map_err(|_| byte_fault()) } fn slice_reference(values: &dever_runtime::Bytes) -> Result { values .get(0..values.len()) .map(<[u8]>::to_vec) .map(Into::into) .ok_or_else(byte_fault) } fn join_reference(values: &dever_runtime::Bytes) -> Result { let mut result = Vec::with_capacity(values.len() + values.len()); result.extend_from_slice(values); result.extend_from_slice(values); Ok(result.into()) } fn roundtrip_generated(values: &[String]) -> Result { GENERATED_ROUNDTRIP(values.first().map(String::as_str).unwrap_or("")).map_err(|_| byte_fault()) } fn roundtrip_reference(values: &[String]) -> Result { let bytes = values .first() .map(String::as_str) .unwrap_or("") .as_bytes() .to_vec(); String::from_utf8(bytes).map_err(|_| byte_fault()) } fn main() { let text = "hello 雪🙂 ".repeat(256); let texts = [text]; let bytes = dever_runtime::Bytes::copy_from_slice(texts[0].as_bytes()); let integers: Vec = (0..1024).map(|value| value % 256).collect(); let invalid = dever_runtime::Bytes::from_static(&[255]); assert!(decode_generated(&invalid).is_err()); assert!(decode_reference(&invalid).is_err()); assert_eq!(GENERATED_IDENTITY(&bytes).unwrap().as_ptr(), bytes.as_ptr()); assert!(convert_generated(&[-1]).is_err()); assert!(convert_reference(&[-1]).is_err()); assert!(convert_generated(&[256]).is_err()); assert!(convert_reference(&[256]).is_err()); println!("case,sample,implementation,elapsed_ns,checksum"); compare_bytes( "bytes_reduce", &bytes, 2000, GENERATED_TOTAL, total_reference, |value| *value as u64, ); compare_bytes( "bytes_each", &bytes, 2000, GENERATED_EACH, each_reference, |value| value.len() as u64, ); compare( "bytes_encode", &texts, 20000, encode_generated, encode_reference, |value| value.len() as u64, ); compare_bytes( "bytes_decode", &bytes, 4000, decode_generated, decode_reference, |value| value.len() as u64, ); compare( "bytes_from_ints", &integers, 2000, convert_generated, convert_reference, |value| value.len() as u64, ); compare_bytes( "bytes_slice", &bytes, 20000, slice_generated, slice_reference, |value| value.len() as u64, ); compare_bytes( "bytes_concat", &bytes, 10000, GENERATED_JOIN, join_reference, |value| value.len() as u64, ); compare( "bytes_roundtrip", &texts, 4000, roundtrip_generated, roundtrip_reference, |value| value.len() as u64, ); }