#function #encode-decode #integer #generate #pointers #mayda

nightly mayda_macros

用于生成mayda所需的基本编码和解码宏

5个版本

使用旧的Rust 2015

0.1.4 2017年9月21日
0.1.3 2016年7月13日
0.1.2 2016年6月20日
0.1.1 2016年6月13日
0.1.0 2016年6月11日

#688 in 压缩


2个crate中使用(通过mayda_codec

MIT/Apache

32KB
697

用于生成基本编码和解码函数的编译器插件。由encode!decode!语法扩展生成的函数遵循encode_T_a_b约定。由encode_simd!decode_simd!语法扩展生成的函数遵循encode_simd_T_a约定。由encode_util!语法扩展生成的函数遵循encode_delta_Tencode_zz_shift_T约定。T是未签名整数类型之一,a是每个整数的位数,b是编码的整数数量。

encode!decode!以位宽和整数数量的步长(32的除数)作为参数。为位宽在0...max_bits之间,以及整数数量为步长的倍数(最多32个)的函数生成。 encode_simd!decode_simd!以位宽和相应simd模块的路径作为参数。为位宽在0...max_bits之间,以及恰好128个整数的函数生成。encode_util!以位宽和相应simd模块的路径作为参数。为类型位宽和任意数量的整数生成函数。

encode!decode! 生成的函数指针分别位于 ENCODE_TDECODE_T 中,其中 encode_T_a_b 的指针位于 ENCODE_T[a][b / c - 1],其中 c 表示步长。由 encode_simd!decode_simd! 生成的函数指针分别位于 ENCODE_SIMD_TDECODE_SIMD_T 中,其中 encode_simd_T_a 的指针位于 ENCODE_SIMD_T[a]。由 encode_util! 生成的函数是公开的。所有数组都是公开的且是常量。

安全性

由本软件包生成的函数使用广泛的不安全指针操作。您必须验证在指针之后已经分配了足够的内存,以便偏移量有效。它们不打算在 mayda 软件包之外使用。

示例

本软件包中定义的语法扩展可以如下调用

encode!(u32, 32, 8);
decode!(u32, 32, 8);

这会被替换成 128 个编码 u32 整数的函数和 128 个解码 u32 整数的函数。例如,编码和解码 8 个 u32 整数的最低 24 位的函数是

unsafe fn encode_u32_24_8(mut i_ptr: *const u32, mut s_ptr: *mut u32) {
    let mut out = *i_ptr as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 24usize;
    *s_ptr = out;
    s_ptr = s_ptr.offset(1);
    out = (*i_ptr >> 8usize) as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 16usize;
    *s_ptr = out;
    s_ptr = s_ptr.offset(1);
    out = (*i_ptr >> 16usize) as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 8usize;
    i_ptr = i_ptr.offset(1);
    *s_ptr = out;
    s_ptr = s_ptr.offset(1);
    out = *i_ptr as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 24usize;
    *s_ptr = out;
    s_ptr = s_ptr.offset(1);
    out = (*i_ptr >> 8usize) as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 16usize;
    *s_ptr = out;
    s_ptr = s_ptr.offset(1);
    out = (*i_ptr >> 16usize) as u32;
    i_ptr = i_ptr.offset(1);
    out |= (*i_ptr as u32) << 8usize;
    *s_ptr = out;
}

unsafe fn decode_u32_24_8(mut s_ptr: *const u32, mut o_ptr: *mut u32) {
    let mask: u32 = !0 >> 8usize;
    let mut out;
    out = *s_ptr as u32;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 24usize) as u32;
    s_ptr = s_ptr.offset(1);
    out |= (*s_ptr as u32) << 8usize;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 16usize) as u32;
    s_ptr = s_ptr.offset(1);
    out |= (*s_ptr as u32) << 16usize;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 8usize) as u32;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    s_ptr = s_ptr.offset(1);
    out = *s_ptr as u32;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 24usize) as u32;
    s_ptr = s_ptr.offset(1);
    out |= (*s_ptr as u32) << 8usize;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 16usize) as u32;
    s_ptr = s_ptr.offset(1);
    out |= (*s_ptr as u32) << 16usize;
    *o_ptr = out & mask;
    o_ptr = o_ptr.offset(1);
    out = (*s_ptr >> 8usize) as u32;
    *o_ptr = out & mask;
}

无运行时依赖