#include <boost/cstdint.hpp> // for boost::uintmax_t #include <cstddef> // for std::size_t namespace boost { template < std::size_t Bits, uintmax_t TruncPoly, uintmax_t InitRem, uintmax_t FinalXor, bool ReflectIn, bool ReflectRem > class crc_optimal; }
boost::crc_optimal 类模板作为一个非增强型 CRC 处理器,可以接收字节级的输入。它将所有 Rocksoft™ 模型 CRC 算法参数作为模板参数。与 crc_basic 一样,WIDTH(宽度)保持为第一个参数,并决定了用于除法寄存器的内置无符号整数类型。其他的 Rocksoft™ 模型 CRC 算法参数移至模板参数字段中,且保持与它们在 crc_basic 构造函数中相同的相对顺序。(某些参数具有默认值。)基于 crc_optimal 的对象既可以进行默认构造(表现与具有相同设置的 crc_basic 对象一致),也可以使用单参数进行构造,该参数会覆盖初始余数值[2],但不会永久改变初始余数属性。
除了模板参数和构造方式外,crc_optimal 在接口方面与 crc_basic 的区别在于:
添加了五个与新模板参数对应的类静态不可变数据成员。
表 9.3. boost::crc_optimal 中的额外 RMCA 表达式
|
新成员 |
等效项 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process_bit 和 process_bits 成员函数。operator () 成员函数。单参数版本转发给 process_byte,使其适用于接受(并可能返回)函数对象的 STL 算法[3]。无参版本转发给 checksum,使其适用于需要生成器对象的 STL 算法[4]。reset 成员函数合并为一个。(它使用一个可以带有默认参数的单个参数。)crc_basic 和 crc_optimal 之间的主要区别在于内部实现。crc_basic 的对象无论输入使用何种单位,其 CRC 算法都是逐位运行的。而 crc_optimal 的对象,当 WIDTH 至少为 CHAR_BIT[5] 时,会使用基于字节索引的查表法 CRC 算法,这比逐位处理要快得多。
由于所有参数均在编译时指定,因此您无法重用同一个计算器对象来运行参数不同的程序。该类型使用自动定义的复制/移动/赋值和析构例程。