mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			2307 lines
		
	
	
		
			93 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			2307 lines
		
	
	
		
			93 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//  Boost CRC library crc.hpp header file  -----------------------------------//
 | 
						|
 | 
						|
//  Copyright 2001, 2004, 2011 Daryle Walker.
 | 
						|
//  Distributed under the Boost Software License, Version 1.0.  (See the
 | 
						|
//  accompanying file LICENSE_1_0.txt or a copy at
 | 
						|
//  <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
						|
 | 
						|
//  See <http://www.boost.org/libs/crc/> for the library's home page.
 | 
						|
 | 
						|
/** \file
 | 
						|
    \brief  A collection of function templates and class templates that compute
 | 
						|
      various forms of Cyclic Redundancy Codes (CRCs).
 | 
						|
 | 
						|
    \author  Daryle Walker
 | 
						|
 | 
						|
    \version  1.5
 | 
						|
 | 
						|
    \copyright  Boost Software License, version 1.0
 | 
						|
 | 
						|
    Contains the declarations (and definitions) of various kinds of CRC
 | 
						|
    computation functions, function object types, and encapsulated policy types.
 | 
						|
 | 
						|
    \warning  The sample CRC-computer types were just checked against the
 | 
						|
      <a href="http://regregex.bbcmicro.net/crc-catalogue.htm">Catalogue of
 | 
						|
      parametrised CRC algorithms</a>.  New type aliases were added where I got
 | 
						|
      a standard wrong.  However, the mistaken <code>typedef</code>s are still
 | 
						|
      there for backwards compatibility.
 | 
						|
    \note  There are references to the <i>Rocksoft™ Model CRC
 | 
						|
      Algorithm</i>, as described within \"A Painless Guide to CRC Error
 | 
						|
      Detection Algorithms,\" linked from \"<a
 | 
						|
      href="http://www.ross.net/crc/crcpaper.html">CRC: A Paper On CRCs</a>\" by
 | 
						|
      Ross Williams.  It will be abbreviated \"RMCA\" in other documentation
 | 
						|
      blocks.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BOOST_CRC_HPP
 | 
						|
#define BOOST_CRC_HPP
 | 
						|
 | 
						|
#include <boost/array.hpp>           // for boost::array
 | 
						|
#include <boost/config.hpp>          // for BOOST_STATIC_CONSTANT, etc.
 | 
						|
#include <boost/cstdint.hpp>         // for UINTMAX_C, boost::uintmax_t
 | 
						|
#include <boost/integer.hpp>         // for boost::uint_t
 | 
						|
#include <boost/type_traits/conditional.hpp>
 | 
						|
#include <boost/type_traits/integral_constant.hpp>
 | 
						|
 | 
						|
#include <climits>  // for CHAR_BIT, etc.
 | 
						|
#include <cstddef>  // for std::size_t
 | 
						|
 | 
						|
#include <boost/limits.hpp>  // for std::numeric_limits
 | 
						|
 | 
						|
 | 
						|
// The type of CRC parameters that can go in a template should be related
 | 
						|
// on the CRC's bit count.  This macro expresses that type in a compact
 | 
						|
// form, but also allows an alternate type for compilers that don't support
 | 
						|
// dependent types (in template value-parameters).
 | 
						|
#if !(defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS))
 | 
						|
#define BOOST_CRC_PARM_TYPE  typename ::boost::uint_t<Bits>::fast
 | 
						|
#else
 | 
						|
#define BOOST_CRC_PARM_TYPE  unsigned long
 | 
						|
#endif
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
 | 
						|
 | 
						|
//  Forward declarations  ----------------------------------------------------//
 | 
						|
 | 
						|
//! Bit-wise CRC computer
 | 
						|
template < std::size_t Bits >
 | 
						|
    class crc_basic;
 | 
						|
 | 
						|
//! Table-driven CRC computer, usable as a function object
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly = 0u,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem = 0u,
 | 
						|
           BOOST_CRC_PARM_TYPE FinalXor = 0u, bool ReflectIn = false,
 | 
						|
           bool ReflectRem = false >
 | 
						|
    class crc_optimal;
 | 
						|
 | 
						|
//! Compute the (unaugmented) CRC of a memory block
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
    typename uint_t<Bits>::fast  crc( void const *buffer,
 | 
						|
     std::size_t byte_count);
 | 
						|
 | 
						|
//! Compute the CRC of a memory block, with any augmentation provided by user
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly >
 | 
						|
    typename uint_t<Bits>::fast  augmented_crc( void const *buffer,
 | 
						|
     std::size_t byte_count,
 | 
						|
     typename uint_t<Bits>::fast initial_remainder = 0u);
 | 
						|
 | 
						|
//! Computation type for ARC|CRC-16|CRC-IBM|CRC-16/ARC|CRC-16/LHA standard
 | 
						|
typedef crc_optimal<16, 0x8005, 0, 0, true, true>         crc_16_type;
 | 
						|
//! Computation type for CRC-16/CCITT-FALSE standard
 | 
						|
typedef crc_optimal<16, 0x1021, 0xFFFF, 0, false, false>  crc_ccitt_false_t;
 | 
						|
//! Computation type for the CRC mistakenly called the CCITT standard
 | 
						|
typedef crc_ccitt_false_t                                 crc_ccitt_type;
 | 
						|
//! Computation type for the actual
 | 
						|
//! KERMIT|CRC-16/CCITT|CRC-16/CCITT-TRUE|CRC-CCITT standard
 | 
						|
typedef crc_optimal<16, 0x1021, 0, 0, true, true>         crc_ccitt_true_t;
 | 
						|
//! Computation type that I mistakenly called the XMODEM standard; it inverts
 | 
						|
//! both reflection parameters and reflects the truncated divisor (Don't use?!)
 | 
						|
typedef crc_optimal<16, 0x8408, 0, 0, true, true>         crc_xmodem_type;
 | 
						|
//! Computation type for the actual XMODEM|ZMODEM|CRC-16/ACORN standard
 | 
						|
typedef crc_optimal<16, 0x1021, 0, 0, false, false>       crc_xmodem_t;
 | 
						|
 | 
						|
//! Computation type for CRC-32|CRC-32/ADCCP|PKZIP standard
 | 
						|
typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>
 | 
						|
  crc_32_type;
 | 
						|
 | 
						|
 | 
						|
//  Forward declarations for implementation detail stuff  --------------------//
 | 
						|
//  (Just for the stuff that will be needed for the next two sections)
 | 
						|
 | 
						|
//! \cond
 | 
						|
namespace detail
 | 
						|
{
 | 
						|
    //! Mix-in class to add a possibly-reflecting member function
 | 
						|
    template < int BitLength, bool DoIt, int Id = 0 >
 | 
						|
        class possible_reflector;
 | 
						|
 | 
						|
    //! Mix-in class for byte-fed, table-driven CRC algorithms
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial, bool Reflect,
 | 
						|
     int Id = 0 >
 | 
						|
    class crc_driver;
 | 
						|
 | 
						|
}  // namespace detail
 | 
						|
//! \endcond
 | 
						|
 | 
						|
 | 
						|
//  Simple cyclic redundancy code (CRC) class declaration  -------------------//
 | 
						|
 | 
						|
/** Objects of this type compute the CRC checksum of submitted data, where said
 | 
						|
    data can be entered piecemeal through several different kinds of groupings.
 | 
						|
    Modulo-2 polynomial division steps are always performed bit-wise, without
 | 
						|
    the use of pre-computation tables.  Said division uses the altered
 | 
						|
    algorithm, so any data has to be unaugmented.
 | 
						|
 | 
						|
    \pre  0 \< \a Bits \<= \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
    \tparam Bits  The order of the modulo-2 polynomial divisor.  (\e Width from
 | 
						|
      the RMCA)
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
class crc_basic
 | 
						|
{
 | 
						|
public:
 | 
						|
    // Type
 | 
						|
    /** \brief  The register type used for computations
 | 
						|
 | 
						|
        This type is used for CRC calculations and is the type for any returned
 | 
						|
        checksums and returned or submitted remainders, (truncated) divisors, or
 | 
						|
        XOR masks.  It is a built-in unsigned integer type.
 | 
						|
     */
 | 
						|
    typedef typename boost::uint_t<Bits>::fast  value_type;
 | 
						|
 | 
						|
    // Constant for the template parameter
 | 
						|
    //! A copy of \a Bits provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( std::size_t, bit_count = Bits );
 | 
						|
 | 
						|
    // Constructor (use the automatic copy-ctr, move-ctr, and dtr)
 | 
						|
    //! Create a computer, separately listing each needed parameter
 | 
						|
    explicit  crc_basic( value_type truncated_polynomial,
 | 
						|
               value_type initial_remainder = 0, value_type final_xor_value = 0,
 | 
						|
               bool reflect_input = false, bool reflect_remainder = false );
 | 
						|
 | 
						|
    // Internal Operations
 | 
						|
    //! Return the (truncated) polynomial divisor
 | 
						|
    value_type  get_truncated_polynominal() const;
 | 
						|
    //! Return what the polynomial remainder was set to during construction
 | 
						|
    value_type  get_initial_remainder() const;
 | 
						|
    //! Return the XOR-mask used during output processing
 | 
						|
    value_type  get_final_xor_value() const;
 | 
						|
    //! Check if input-bytes will be reflected before processing
 | 
						|
    bool        get_reflect_input() const;
 | 
						|
    //! Check if the remainder will be reflected during output processing
 | 
						|
    bool        get_reflect_remainder() const;
 | 
						|
 | 
						|
    //! Return the remainder based from already-processed bits
 | 
						|
    value_type  get_interim_remainder() const;
 | 
						|
    //! Change the interim remainder to a new value
 | 
						|
    void        reset( value_type new_rem );
 | 
						|
    //! Change the interim remainder back to the initial value
 | 
						|
    void        reset();
 | 
						|
 | 
						|
    // External Operations
 | 
						|
    //! Submit a single bit for input processing
 | 
						|
    void  process_bit( bool bit );
 | 
						|
    //! Submit the lowest \a bit_length bits of a byte for input processing
 | 
						|
    void  process_bits( unsigned char bits, std::size_t bit_length );
 | 
						|
    //! Submit a single byte for input processing
 | 
						|
    void  process_byte( unsigned char byte );
 | 
						|
    //! Submit a memory block for input processing, iterator-pair style
 | 
						|
    void  process_block( void const *bytes_begin, void const *bytes_end );
 | 
						|
    //! Submit a memory block for input processing, pointer-and-size style
 | 
						|
    void  process_bytes( void const *buffer, std::size_t byte_count );
 | 
						|
 | 
						|
    //! Return the checksum of the already-processed bits
 | 
						|
    value_type  checksum() const;
 | 
						|
 | 
						|
private:
 | 
						|
    // Member data
 | 
						|
    value_type  rem_;
 | 
						|
    value_type  poly_, init_, final_;  // non-const to allow assignability
 | 
						|
    bool        rft_in_, rft_out_;     // non-const to allow assignability
 | 
						|
 | 
						|
};  // boost::crc_basic
 | 
						|
 | 
						|
 | 
						|
//  Optimized cyclic redundancy code (CRC) class declaration  ----------------//
 | 
						|
 | 
						|
/** Objects of this type compute the CRC checksum of submitted data, where said
 | 
						|
    data can be entered piecemeal through several different kinds of groupings.
 | 
						|
    Modulo-2 polynomial division steps are performed byte-wise, aided by the use
 | 
						|
    of pre-computation tables.  Said division uses the altered algorithm, so any
 | 
						|
    data has to be unaugmented.
 | 
						|
 | 
						|
    \pre  0 \< \a Bits \<= \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
    \tparam Bits  The order of the modulo-2 polynomial divisor.  (\e Width from
 | 
						|
      the RMCA)
 | 
						|
    \tparam TruncPoly  The lowest coefficients of the divisor polynomial.  The
 | 
						|
      highest-order coefficient is omitted and always assumed to be 1.  Defaults
 | 
						|
      to \c 0, i.e. the only non-zero term is the implicit one for
 | 
						|
      x<sup><var>Bits</var></sup>.  (\e Poly from the RMCA)
 | 
						|
    \tparam InitRem  The (unaugmented) initial state of the polynomial
 | 
						|
      remainder.  Defaults to \c 0 if omitted.  (\e Init from the RMCA)
 | 
						|
    \tparam FinalXor  The (XOR) bit-mask to be applied to the output remainder,
 | 
						|
      after possible reflection but before returning.  Defaults to \c 0 (i.e. no
 | 
						|
      bit changes) if omitted.  (\e XorOut from the RMCA)
 | 
						|
    \tparam ReflectIn  If \c true, input bytes are read lowest-order bit first,
 | 
						|
      otherwise highest-order bit first.  Defaults to \c false if omitted.
 | 
						|
      (\e RefIn from the RMCA)
 | 
						|
    \tparam ReflectRem  If \c true, the output remainder is reflected before the
 | 
						|
      XOR-mask.  Defaults to \c false if omitted.  (\e RefOut from the RMCA)
 | 
						|
 | 
						|
    \todo  Get rid of the default value for \a TruncPoly.  Choosing a divisor is
 | 
						|
      an important decision with many factors, so a default is never useful,
 | 
						|
      especially a bad one.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
class crc_optimal
 | 
						|
{
 | 
						|
public:
 | 
						|
    // Type
 | 
						|
    //! \copydoc  boost::crc_basic::value_type
 | 
						|
    typedef typename boost::uint_t<Bits>::fast  value_type;
 | 
						|
 | 
						|
    // Constants for the template parameters
 | 
						|
    //! \copydoc  boost::crc_basic::bit_count
 | 
						|
    BOOST_STATIC_CONSTANT( std::size_t, bit_count = Bits );
 | 
						|
    //! A copy of \a TruncPoly provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( value_type, truncated_polynominal = TruncPoly );
 | 
						|
    //! A copy of \a InitRem provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( value_type, initial_remainder = InitRem );
 | 
						|
    //! A copy of \a FinalXor provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( value_type, final_xor_value = FinalXor );
 | 
						|
    //! A copy of \a ReflectIn provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( bool, reflect_input = ReflectIn );
 | 
						|
    //! A copy of \a ReflectRem provided for meta-programming purposes
 | 
						|
    BOOST_STATIC_CONSTANT( bool, reflect_remainder = ReflectRem );
 | 
						|
 | 
						|
    // Constructor (use the automatic copy-ctr, move-ctr, and dtr)
 | 
						|
    //! Create a computer, giving an initial remainder if desired
 | 
						|
    explicit  crc_optimal( value_type init_rem = initial_remainder );
 | 
						|
 | 
						|
    // Internal Operations
 | 
						|
    //! \copybrief  boost::crc_basic::get_truncated_polynominal
 | 
						|
    value_type  get_truncated_polynominal() const;
 | 
						|
    //! \copybrief  boost::crc_basic::get_initial_remainder
 | 
						|
    value_type  get_initial_remainder() const;
 | 
						|
    //! \copybrief  boost::crc_basic::get_final_xor_value
 | 
						|
    value_type  get_final_xor_value() const;
 | 
						|
    //! \copybrief  boost::crc_basic::get_reflect_input
 | 
						|
    bool        get_reflect_input() const;
 | 
						|
    //! \copybrief  boost::crc_basic::get_reflect_remainder
 | 
						|
    bool        get_reflect_remainder() const;
 | 
						|
 | 
						|
    //! \copybrief  boost::crc_basic::get_interim_remainder
 | 
						|
    value_type  get_interim_remainder() const;
 | 
						|
    //! Change the interim remainder to either a given value or the initial one
 | 
						|
    void        reset( value_type new_rem = initial_remainder );
 | 
						|
 | 
						|
    // External Operations
 | 
						|
    //! \copybrief  boost::crc_basic::process_byte
 | 
						|
    void  process_byte( unsigned char byte );
 | 
						|
    //! \copybrief  boost::crc_basic::process_block
 | 
						|
    void  process_block( void const *bytes_begin, void const *bytes_end );
 | 
						|
    //! \copybrief  boost::crc_basic::process_bytes
 | 
						|
    void  process_bytes( void const *buffer, std::size_t byte_count );
 | 
						|
 | 
						|
    //! \copybrief  boost::crc_basic::checksum
 | 
						|
    value_type  checksum() const;
 | 
						|
 | 
						|
    // Operators
 | 
						|
    //! Submit a single byte for input processing, suitable for the STL
 | 
						|
    void        operator ()( unsigned char byte );
 | 
						|
    //! Return the checksum of the already-processed bits, suitable for the STL
 | 
						|
    value_type  operator ()() const;
 | 
						|
 | 
						|
private:
 | 
						|
    // Implementation types
 | 
						|
    // (Processing for reflected input gives reflected remainders, so you only
 | 
						|
    // have to apply output-reflection if Reflect-Remainder doesn't match
 | 
						|
    // Reflect-Input.)
 | 
						|
    typedef detail::possible_reflector<Bits, ReflectIn>     reflect_i_type;
 | 
						|
    typedef detail::crc_driver<Bits, TruncPoly, ReflectIn>  crc_table_type;
 | 
						|
    typedef detail::possible_reflector<Bits, ReflectRem != ReflectIn>
 | 
						|
      reflect_o_type;
 | 
						|
 | 
						|
    // Member data
 | 
						|
    value_type  rem_;
 | 
						|
 | 
						|
};  // boost::crc_optimal
 | 
						|
 | 
						|
 | 
						|
//  Implementation detail stuff  ---------------------------------------------//
 | 
						|
 | 
						|
//! \cond
 | 
						|
namespace detail
 | 
						|
{
 | 
						|
    /** \brief  Meta-programming integral constant for a single-bit bit-mask
 | 
						|
 | 
						|
        Generates a compile-time constant for a bit-mask that affects a single
 | 
						|
        bit.  The \c value will be 2<sup><var>BitIndex</var></sup>.  The \c type
 | 
						|
        will be the smallest built-in unsigned integer type that can contain the
 | 
						|
        value, unless there's a built-in type that the system can handle easier,
 | 
						|
        then the \c type will be smallest fast-handled unsigned integer type.
 | 
						|
 | 
						|
        \pre  0 \<= BitIndex \< \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
        \tparam BitIndex  The place of the sole set bit.
 | 
						|
     */
 | 
						|
    template < int BitIndex >
 | 
						|
    struct high_bit_mask_c
 | 
						|
        : boost::integral_constant<typename boost::uint_t< BitIndex + 1 >::fast,
 | 
						|
           ( UINTMAX_C(1) << BitIndex )>
 | 
						|
    {};
 | 
						|
 | 
						|
    /** \brief  Meta-programming integral constant for a lowest-bits bit-mask
 | 
						|
 | 
						|
        Generates a compile-time constant for a bit-mask that affects the lowest
 | 
						|
        bits.  The \c value will be 2<sup><var>BitCount</var></sup> - 1.  The
 | 
						|
        \c type will be the smallest built-in unsigned integer type that can
 | 
						|
        contain the value, unless there's a built-in type that the system can
 | 
						|
        handle easier, then the \c type will be smallest fast-handled unsigned
 | 
						|
        integer type.
 | 
						|
 | 
						|
        \pre  0 \<= BitCount \<= \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
        \tparam BitCount  The number of lowest-placed bits set.
 | 
						|
     */
 | 
						|
    template < int BitCount >
 | 
						|
    struct low_bits_mask_c
 | 
						|
        : boost::integral_constant<typename boost::uint_t< BitCount >::fast, (
 | 
						|
           BitCount ? (( (( UINTMAX_C(1) << (BitCount - 1) ) - 1u) << 1 ) |
 | 
						|
           UINTMAX_C( 1 )) : 0u )>
 | 
						|
    {};
 | 
						|
 | 
						|
    /** \brief  Reflects the bits of a number
 | 
						|
 | 
						|
        Reverses the order of the given number of bits within a value.  For
 | 
						|
        instance, if the given reflect count is 5, then the bit values for the
 | 
						|
        16- and 1-place will switch and the 8- and 2-place will switch, leaving
 | 
						|
        the other bits alone.  (The 4-place bit is in the middle, so it wouldn't
 | 
						|
        change.)
 | 
						|
 | 
						|
        \pre  \a Unsigned is a built-in unsigned integer type
 | 
						|
        \pre  0 \< word_length \<= \c std\::numeric_limits\<Unsigned\>\::digits
 | 
						|
 | 
						|
        \tparam Unsigned  The type of \a x.
 | 
						|
 | 
						|
        \param x  The value to be (partially) reflected.
 | 
						|
        \param word_length  The number of low-order bits to reflect.  Defaults
 | 
						|
          to the total number of value bits in \a Unsigned.
 | 
						|
 | 
						|
        \return  The (partially) reflected value.
 | 
						|
 | 
						|
        \todo  Check if this is the fastest way.
 | 
						|
     */
 | 
						|
    template < typename Unsigned >
 | 
						|
    Unsigned  reflect_unsigned( Unsigned x, int word_length
 | 
						|
     = std::numeric_limits<Unsigned>::digits )
 | 
						|
    {
 | 
						|
        for ( Unsigned  l = 1u, h = l << (word_length - 1) ; h > l ; h >>= 1, l
 | 
						|
         <<= 1 )
 | 
						|
        {
 | 
						|
            Unsigned const  m = h | l, t = x & m;
 | 
						|
 | 
						|
            if ( (t == h) || (t == l) )
 | 
						|
                x ^= m;
 | 
						|
        }
 | 
						|
 | 
						|
        return x;
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Make a byte-to-byte-reflection map
 | 
						|
 | 
						|
        Creates a mapping array so the results can be cached.  Uses
 | 
						|
        #reflect_unsigned to generate the element values.
 | 
						|
 | 
						|
        \return  An array <var>a</var> such that, for a given byte value
 | 
						|
          <var>i</var>, <code><var>a</var>[ <var>i</var> ]</code> resolves to
 | 
						|
          the reflected value of <var>i</var>.
 | 
						|
     */
 | 
						|
    boost::array< unsigned char, (UINTMAX_C( 1 ) << CHAR_BIT) >
 | 
						|
    inline make_byte_reflection_table()
 | 
						|
    {
 | 
						|
        boost::array<unsigned char, ( UINTMAX_C(1) << CHAR_BIT )>  result;
 | 
						|
        unsigned char                                              i = 0u;
 | 
						|
 | 
						|
        do
 | 
						|
            result[ i ] = reflect_unsigned( i );
 | 
						|
        while ( ++i );
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Reflects the bits of a single byte
 | 
						|
 | 
						|
        Reverses the order of all the bits within a value.  For instance, the
 | 
						|
        bit values for the 2<sup><code>CHAR_BIT</code> - 1</sup>- and 1-place
 | 
						|
        will switch and the 2<sup><code>CHAR_BIT</code> - 2</sup>- and 2-place
 | 
						|
        will switch, etc.
 | 
						|
 | 
						|
        \param x  The byte value to be reflected.
 | 
						|
 | 
						|
        \return  The reflected value.
 | 
						|
 | 
						|
        \note  Since this could be the most common type of reflection, and the
 | 
						|
          number of states is relatively small, the implementation pre-computes
 | 
						|
          and uses a table of all the results.
 | 
						|
     */
 | 
						|
    inline unsigned char  reflect_byte( unsigned char x )
 | 
						|
    {
 | 
						|
        static  boost::array<unsigned char, ( UINTMAX_C(1) << CHAR_BIT )> const
 | 
						|
          table = make_byte_reflection_table();
 | 
						|
 | 
						|
        return table[ x ];
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Reflects some bits within a single byte
 | 
						|
 | 
						|
        Like #reflect_unsigned, except it takes advantage of any (long-term)
 | 
						|
        speed gains #reflect_byte may bring.
 | 
						|
 | 
						|
        \pre  0 \< \a word_length \<= \c CHAR_BIT
 | 
						|
 | 
						|
        \param x  The value to be (partially) reflected.
 | 
						|
        \param word_length  The number of low-order bits to reflect.
 | 
						|
 | 
						|
        \return  The (partially) reflected value.
 | 
						|
     */
 | 
						|
    inline  unsigned char  reflect_sub_byte( unsigned char x, int word_length )
 | 
						|
    { return reflect_byte(x) >> (CHAR_BIT - word_length); }
 | 
						|
 | 
						|
    /** \brief  Possibly reflects the bits of a number
 | 
						|
 | 
						|
        Reverses the order of the given number of bits within a value.  For
 | 
						|
        instance, if the given reflect count is 5, then the bit values for the
 | 
						|
        16- and 1-place will switch and the 8- and 2-place will switch, leaving
 | 
						|
        the other bits alone.  (The 4-place bit is in the middle, so it wouldn't
 | 
						|
        change.)  This variant function allows the reflection be controlled by
 | 
						|
        an extra parameter, in case the decision to use reflection is made at
 | 
						|
        run-time.
 | 
						|
 | 
						|
        \pre  \a Unsigned is a built-in unsigned integer type
 | 
						|
        \pre  0 \< word_length \<= \c std\::numeric_limits\<Unsigned\>\::digits
 | 
						|
 | 
						|
        \tparam Unsigned  The type of \a x.
 | 
						|
 | 
						|
        \param x  The value to be (partially) reflected.
 | 
						|
        \param reflect  Controls whether \a x is actually reflected (\c true) or
 | 
						|
          left alone (\c false).
 | 
						|
        \param word_length  The number of low-order bits to reflect.  Defaults
 | 
						|
          to the total number of value bits in \a Unsigned.
 | 
						|
 | 
						|
        \return  The possibly (partially) reflected value.
 | 
						|
     */
 | 
						|
    template < typename Unsigned >
 | 
						|
    inline
 | 
						|
    Unsigned  reflect_optionally( Unsigned x, bool reflect, int word_length
 | 
						|
     = std::numeric_limits<Unsigned>::digits )
 | 
						|
    { return reflect ? reflect_unsigned(x, word_length) : x; }
 | 
						|
 | 
						|
    /** \brief  Possibly reflects the bits of a single byte
 | 
						|
 | 
						|
        Uses #reflect_byte (if \a reflect is \c true).
 | 
						|
 | 
						|
        \param x  The byte value to be (possibly) reflected.
 | 
						|
        \param reflect  Whether (\c true) or not (\c false) \a x is reflected.
 | 
						|
 | 
						|
        \return  <code><var>reflect</var> ? reflect_byte(<var>x</var>) :
 | 
						|
          <var>x</var></code>
 | 
						|
     */
 | 
						|
    inline
 | 
						|
    unsigned char  reflect_byte_optionally( unsigned char x, bool reflect )
 | 
						|
    { return reflect ? reflect_byte(x) : x; }
 | 
						|
 | 
						|
    /** \brief  Update a CRC remainder by several bits, assuming a non-augmented
 | 
						|
          message
 | 
						|
 | 
						|
        Performs several steps of division required by the CRC algorithm, giving
 | 
						|
        a new remainder polynomial based on the divisor polynomial and the
 | 
						|
        synthesized dividend polynomial (from the old remainder and the
 | 
						|
        newly-provided input).  The computations assume that the CRC is directly
 | 
						|
        exposed from the remainder, without any zero-valued bits augmented to
 | 
						|
        the message bits.
 | 
						|
 | 
						|
        \pre  \a Register and \a Word are both built-in unsigned integer types
 | 
						|
        \pre  0 \< \a register_length \<= std\::numeric_limits\<\a Register\>
 | 
						|
          \::digits
 | 
						|
        \pre  0 \< \a word_length \<= std\::numeric_limits\<\a Word\>\::digits
 | 
						|
 | 
						|
        \tparam Register  The type used for representing the remainder and
 | 
						|
          divisor modulo-2 polynomials.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i>.
 | 
						|
        \tparam Word  The type used for storing the incoming terms of the
 | 
						|
          dividend modulo-2 polynomial.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i> when \a reflect is
 | 
						|
          \c false, and the coefficient of <i>x<sup><var>word_length</var> - 1 -
 | 
						|
          i</sup></i> otherwise.
 | 
						|
 | 
						|
        \param[in]     register_length  The number of significant low-order bits
 | 
						|
          to be used from \a Register values.  It is the order of the modulo-2
 | 
						|
          polynomial remainder and one less than the divisor's order.
 | 
						|
        \param[in,out] remainder  The upper part of the dividend polynomial
 | 
						|
          before division, and the remainder polynomial after.
 | 
						|
        \param[in]     new_dividend_bits  The coefficients for the next
 | 
						|
          \a word_length lowest terms of the dividend polynomial.
 | 
						|
        \param[in]     truncated_divisor  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \param[in]     word_length  The number of lowest-order bits to read from
 | 
						|
          \a new_dividend_bits.
 | 
						|
        \param[in]     reflect  If \c false, read from the highest-order marked
 | 
						|
          bit from \a new_dividend_bits and go down, as normal.  Otherwise,
 | 
						|
          proceed from the lowest-order bit and go up.
 | 
						|
 | 
						|
        \note  This routine performs a modulo-2 polynomial division variant.
 | 
						|
          The exclusive-or operations are applied in a different order, since
 | 
						|
          that kind of operation is commutative and associative.  It also
 | 
						|
          assumes that the zero-valued augment string was applied before this
 | 
						|
          step, which means that the updated remainder can be directly used as
 | 
						|
          the final CRC.
 | 
						|
     */
 | 
						|
    template < typename Register, typename Word >
 | 
						|
    void  crc_modulo_word_update( int register_length, Register &remainder, Word
 | 
						|
     new_dividend_bits, Register truncated_divisor, int word_length, bool
 | 
						|
     reflect )
 | 
						|
    {
 | 
						|
        // Create this masking constant outside the loop.
 | 
						|
        Register const  high_bit_mask = UINTMAX_C(1) << (register_length - 1);
 | 
						|
 | 
						|
        // The natural reading order for division is highest digit/bit first.
 | 
						|
        // The "reflect" parameter switches this.  However, building a bit mask
 | 
						|
        // for the lowest bit is the easiest....
 | 
						|
        new_dividend_bits = reflect_optionally( new_dividend_bits, !reflect,
 | 
						|
         word_length );
 | 
						|
 | 
						|
        // Perform modulo-2 division for each new dividend input bit
 | 
						|
        for ( int  i = word_length ; i ; --i, new_dividend_bits >>= 1 )
 | 
						|
        {
 | 
						|
            // compare the new bit with the remainder's highest
 | 
						|
            remainder ^= ( new_dividend_bits & 1u ) ? high_bit_mask : 0u;
 | 
						|
 | 
						|
            // perform modulo-2 division
 | 
						|
            bool const  quotient = remainder & high_bit_mask;
 | 
						|
 | 
						|
            remainder <<= 1;
 | 
						|
            remainder ^= quotient ? truncated_divisor : 0u;
 | 
						|
 | 
						|
            // The quotient isn't used for anything, so don't keep it.
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Update a CRC remainder by a single bit, assuming a non-augmented
 | 
						|
          message
 | 
						|
 | 
						|
        Performs the next step of division required by the CRC algorithm, giving
 | 
						|
        a new remainder polynomial based on the divisor polynomial and the
 | 
						|
        synthesized dividend polynomial (from the old remainder and the
 | 
						|
        newly-provided input).  The computations assume that the CRC is directly
 | 
						|
        exposed from the remainder, without any zero-valued bits augmented to
 | 
						|
        the message bits.
 | 
						|
 | 
						|
        \pre  \a Register is a built-in unsigned integer type
 | 
						|
        \pre  0 \< \a register_length \<= std\::numeric_limits\<\a Register\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam Register  The type used for representing the remainder and
 | 
						|
          divisor modulo-2 polynomials.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i>.
 | 
						|
 | 
						|
        \param[in]     register_length  The number of significant low-order bits
 | 
						|
          to be used from \a Register values.  It is the order of the modulo-2
 | 
						|
          polynomial remainder and one less than the divisor's order.
 | 
						|
        \param[in,out] remainder  The upper part of the dividend polynomial
 | 
						|
          before division, and the remainder polynomial after.
 | 
						|
        \param[in]     new_dividend_bit  The coefficient for the constant term
 | 
						|
          of the dividend polynomial.
 | 
						|
        \param[in]     truncated_divisor  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
 | 
						|
        \note  This routine performs a modulo-2 polynomial division variant.
 | 
						|
          The exclusive-or operations are applied in a different order, since
 | 
						|
          that kind of operation is commutative and associative.  It also
 | 
						|
          assumes that the zero-valued augment string was applied before this
 | 
						|
          step, which means that the updated remainder can be directly used as
 | 
						|
          the final CRC.
 | 
						|
     */
 | 
						|
    template < typename Register >
 | 
						|
    inline  void  crc_modulo_update( int register_length, Register &remainder,
 | 
						|
     bool new_dividend_bit, Register truncated_divisor )
 | 
						|
    {
 | 
						|
        crc_modulo_word_update( register_length, remainder,
 | 
						|
         static_cast<unsigned>(new_dividend_bit), truncated_divisor, 1, false );
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Update a CRC remainder by several bits, assuming an augmented
 | 
						|
          message
 | 
						|
 | 
						|
        Performs several steps of division required by the CRC algorithm, giving
 | 
						|
        a new remainder polynomial based on the divisor polynomial and the
 | 
						|
        synthesized dividend polynomial (from the old remainder and the
 | 
						|
        newly-provided input).  The computations assume that a zero-valued
 | 
						|
        string of bits will be appended to the message before extracting the
 | 
						|
        CRC.
 | 
						|
 | 
						|
        \pre  \a Register and \a Word are both built-in unsigned integer types
 | 
						|
        \pre  0 \< \a register_length \<= std\::numeric_limits\<\a Register\>
 | 
						|
          \::digits
 | 
						|
        \pre  0 \< \a word_length \<= std\::numeric_limits\<\a Word\>\::digits
 | 
						|
 | 
						|
        \tparam Register  The type used for representing the remainder and
 | 
						|
          divisor modulo-2 polynomials.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i>.
 | 
						|
        \tparam Word  The type used for storing the incoming terms of the
 | 
						|
          dividend modulo-2 polynomial.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i> when \a reflect is
 | 
						|
          \c false, and the coefficient of <i>x<sup><var>word_length</var> - 1 -
 | 
						|
          i</sup></i> otherwise.
 | 
						|
 | 
						|
        \param[in]     register_length  The number of significant low-order bits
 | 
						|
          to be used from \a Register values.  It is the order of the modulo-2
 | 
						|
          polynomial remainder and one less than the divisor's order.
 | 
						|
        \param[in,out] remainder  The upper part of the dividend polynomial
 | 
						|
          before division, and the remainder polynomial after.
 | 
						|
        \param[in]     new_dividend_bits  The coefficients for the next
 | 
						|
          \a word_length lowest terms of the dividend polynomial.
 | 
						|
        \param[in]     truncated_divisor  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \param[in]     word_length  The number of lowest-order bits to read from
 | 
						|
          \a new_dividend_bits.
 | 
						|
        \param[in]     reflect  If \c false, read from the highest-order marked
 | 
						|
          bit from \a new_dividend_bits and go down, as normal.  Otherwise,
 | 
						|
          proceed from the lowest-order bit and go up.
 | 
						|
 | 
						|
        \note  This routine performs straight-forward modulo-2 polynomial
 | 
						|
          division.  It assumes that an augment string will be processed at the
 | 
						|
          end of the message bits before doing CRC analysis.
 | 
						|
        \todo  Use this function somewhere so I can test it.
 | 
						|
     */
 | 
						|
    template < typename Register, typename Word >
 | 
						|
    void  augmented_crc_modulo_word_update( int register_length, Register
 | 
						|
     &remainder, Word new_dividend_bits, Register truncated_divisor, int
 | 
						|
     word_length, bool reflect )
 | 
						|
    {
 | 
						|
        // Create this masking constant outside the loop.
 | 
						|
        Register const  high_bit_mask = UINTMAX_C(1) << (register_length - 1);
 | 
						|
 | 
						|
        // The natural reading order for division is highest digit/bit first.
 | 
						|
        // The "reflect" parameter switches this.  However, building a bit mask
 | 
						|
        // for the lowest bit is the easiest....
 | 
						|
        new_dividend_bits = reflect_optionally( new_dividend_bits, not reflect,
 | 
						|
         word_length );
 | 
						|
 | 
						|
        // Perform modulo-2 division for each new dividend input bit
 | 
						|
        for ( int  i = word_length ; i ; --i, new_dividend_bits >>= 1 )
 | 
						|
        {
 | 
						|
            bool const  quotient = remainder & high_bit_mask;
 | 
						|
 | 
						|
            remainder <<= 1;
 | 
						|
            remainder |= new_dividend_bits & 1u;
 | 
						|
            remainder ^= quotient ? truncated_divisor : 0u;
 | 
						|
 | 
						|
            // The quotient isn't used for anything, so don't keep it.
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  Update a CRC remainder by a single bit, assuming an augmented
 | 
						|
          message
 | 
						|
 | 
						|
        Performs the next step of division required by the CRC algorithm, giving
 | 
						|
        a new remainder polynomial based on the divisor polynomial and the
 | 
						|
        synthesized dividend polynomial (from the old remainder and the
 | 
						|
        newly-provided input).  The computations assume that a zero-valued
 | 
						|
        string of bits will be appended to the message before extracting the
 | 
						|
        CRC.
 | 
						|
 | 
						|
        \pre  \a Register is a built-in unsigned integer type
 | 
						|
        \pre  0 \< \a register_length \<= std\::numeric_limits\<\a Register\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam Register  The type used for representing the remainder and
 | 
						|
          divisor modulo-2 polynomials.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i>.
 | 
						|
 | 
						|
        \param[in]     register_length  The number of significant low-order bits
 | 
						|
          to be used from \a Register values.  It is the order of the modulo-2
 | 
						|
          polynomial remainder and one less than the divisor's order.
 | 
						|
        \param[in,out] remainder  The upper part of the dividend polynomial
 | 
						|
          before division, and the remainder polynomial after.
 | 
						|
        \param[in]     new_dividend_bit  The coefficient for the constant term
 | 
						|
          of the dividend polynomial.
 | 
						|
        \param[in]     truncated_divisor  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
 | 
						|
        \note  This routine performs straight-forward modulo-2 polynomial
 | 
						|
          division.  It assumes that an augment string will be processed at the
 | 
						|
          end of the message bits before doing CRC analysis.
 | 
						|
        \todo  Use this function somewhere so I can test it.
 | 
						|
     */
 | 
						|
    template < typename Register >
 | 
						|
    inline  void  augmented_crc_modulo_update( int register_length, Register
 | 
						|
     &remainder, bool new_dividend_bit, Register truncated_divisor )
 | 
						|
    {
 | 
						|
        augmented_crc_modulo_word_update( register_length, remainder,
 | 
						|
         static_cast<unsigned>(new_dividend_bit), truncated_divisor, 1, false );
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  A mix-in class that returns its argument
 | 
						|
 | 
						|
        This class template makes a function object that returns its argument
 | 
						|
        as-is.  It's one case for #possible_reflector.
 | 
						|
 | 
						|
        \pre  0 \< \a BitLength \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam BitLength  How many significant bits arguments have.
 | 
						|
     */
 | 
						|
    template < int BitLength >
 | 
						|
    class non_reflector
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for specialization
 | 
						|
 | 
						|
            This is a Boost integral constant indicating that this class
 | 
						|
            does not reflect its input values.
 | 
						|
         */
 | 
						|
        typedef boost::false_type                 is_reflecting_type;
 | 
						|
        /** \brief  The type to check for register bit length
 | 
						|
 | 
						|
            This is a Boost integral constant indicating how many
 | 
						|
            significant bits won't actually be reflected.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< int, BitLength >      width_c;
 | 
						|
        /** \brief  The type of (not-)reflected values
 | 
						|
 | 
						|
            This type is the input and output type for the (possible-)
 | 
						|
            reflection function, which does nothing here.
 | 
						|
         */
 | 
						|
        typedef typename boost::uint_t< BitLength >::fast  value_type;
 | 
						|
 | 
						|
        /** \brief  Does nothing
 | 
						|
 | 
						|
            Returns the given value, not reflecting any part of it.
 | 
						|
 | 
						|
            \param x  The value to not be reflected.
 | 
						|
 | 
						|
            \return  \a x
 | 
						|
         */
 | 
						|
        inline  static  value_type  reflect_q( value_type x )
 | 
						|
        { return x; }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that reflects (the lower part of) its argument,
 | 
						|
          generally for types larger than a byte
 | 
						|
 | 
						|
        This class template makes a function object that returns its argument
 | 
						|
        after reflecting its lower-order bits.  It's one sub-case for
 | 
						|
        #possible_reflector.
 | 
						|
 | 
						|
        \pre  \c CHAR_BIT \< \a BitLength \<= \c std\::numeric_limits\<uintmax_t
 | 
						|
          \>\::digits
 | 
						|
 | 
						|
        \tparam BitLength  How many significant bits arguments have.
 | 
						|
     */
 | 
						|
    template < int BitLength >
 | 
						|
    class super_byte_reflector
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for specialization
 | 
						|
 | 
						|
            This is a Boost integral constant indicating that this class
 | 
						|
            does reflect its input values.
 | 
						|
         */
 | 
						|
        typedef boost::true_type                  is_reflecting_type;
 | 
						|
        /** \brief  The type to check for register bit length
 | 
						|
 | 
						|
            This is a Boost integral constant indicating how many
 | 
						|
            significant bits will be reflected.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< int, BitLength >      width_c;
 | 
						|
        /** \brief  The type of reflected values
 | 
						|
 | 
						|
            This is both the input and output type for the reflection function.
 | 
						|
         */
 | 
						|
        typedef typename boost::uint_t< BitLength >::fast  value_type;
 | 
						|
 | 
						|
        /** \brief  Reflect (part of) the given value
 | 
						|
 | 
						|
            Reverses the order of the given number of bits within a value,
 | 
						|
            using #reflect_unsigned.
 | 
						|
 | 
						|
            \param x  The value to be (partially) reflected.
 | 
						|
 | 
						|
            \return  ( <var>x</var> &
 | 
						|
              ~(2<sup><var>width_c</var>\::value</sup> - 1) ) | REFLECT(
 | 
						|
              <var>x</var> & (2<sup><var>width_c</var>\::value</sup> -
 | 
						|
              1) )
 | 
						|
         */
 | 
						|
        inline  static  value_type  reflect_q( value_type x )
 | 
						|
        { return reflect_unsigned(x, width_c::value); }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that reflects (the lower part of) its argument,
 | 
						|
          generally for bytes
 | 
						|
 | 
						|
        This class template makes a function object that returns its argument
 | 
						|
        after reflecting its lower-order bits.  It's one sub-case for
 | 
						|
        #possible_reflector.
 | 
						|
 | 
						|
        \pre  0 \< \a BitLength \<= \c CHAR_BIT
 | 
						|
 | 
						|
        \tparam BitLength  How many significant bits arguments have.
 | 
						|
     */
 | 
						|
    template < int BitLength >
 | 
						|
    class sub_type_reflector
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for specialization
 | 
						|
 | 
						|
            This is a Boost integral constant indicating that this class
 | 
						|
            does reflect its input values.
 | 
						|
         */
 | 
						|
        typedef boost::true_type              is_reflecting_type;
 | 
						|
        /** \brief  The type to check for register bit length
 | 
						|
 | 
						|
            This is a Boost integral constant indicating how many
 | 
						|
            significant bits will be reflected.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< int, BitLength >  width_c;
 | 
						|
        /** \brief  The type of reflected values
 | 
						|
 | 
						|
            This is both the input and output type for the reflection function.
 | 
						|
         */
 | 
						|
        typedef unsigned char                          value_type;
 | 
						|
 | 
						|
        /** \brief  Reflect (part of) the given value
 | 
						|
 | 
						|
            Reverses the order of the given number of bits within a value,
 | 
						|
            using #reflect_sub_byte.
 | 
						|
 | 
						|
            \param x  The value to be (partially) reflected.
 | 
						|
 | 
						|
            \return  ( <var>x</var> &
 | 
						|
              ~(2<sup><var>width_c</var>\::value</sup> - 1) ) | REFLECT(
 | 
						|
              <var>x</var> & (2<sup><var>width_c</var>\::value</sup> -
 | 
						|
              1) )
 | 
						|
         */
 | 
						|
        inline  static  value_type  reflect_q( value_type x )
 | 
						|
        { return reflect_sub_byte(x, width_c::value); }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that reflects (the lower part of) its argument
 | 
						|
 | 
						|
        This class template makes a function object that returns its argument
 | 
						|
        after reflecting its lower-order bits.  It's one case for
 | 
						|
        #possible_reflector.
 | 
						|
 | 
						|
        \pre  0 \< \a BitLength \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam BitLength  How many significant bits arguments have.
 | 
						|
     */
 | 
						|
    template < int BitLength >
 | 
						|
    class reflector
 | 
						|
        : public boost::conditional< (BitLength > CHAR_BIT),
 | 
						|
          super_byte_reflector<BitLength>, sub_type_reflector<BitLength> >::type
 | 
						|
    { };
 | 
						|
 | 
						|
    /** This class template adds a member function #reflect_q that will
 | 
						|
        conditionally reflect its first argument, controlled by a compile-time
 | 
						|
        parameter.
 | 
						|
 | 
						|
        \pre  0 \< \a BitLength \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam BitLength  How many significant bits arguments have.
 | 
						|
        \tparam DoIt  \c true if #reflect_q will reflect, \c false if it should
 | 
						|
          return its argument unchanged.
 | 
						|
        \tparam Id  An extra differentiator if multiple copies of this class
 | 
						|
          template are mixed-in as base classes.  Defaults to 0 if omitted.
 | 
						|
     */
 | 
						|
    template < int BitLength, bool DoIt, int Id >
 | 
						|
    class possible_reflector
 | 
						|
        : public boost::conditional< DoIt, reflector<BitLength>,
 | 
						|
          non_reflector<BitLength> >::type
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for ID
 | 
						|
 | 
						|
            This is a Boost integral constant indicating what ID number this
 | 
						|
            instantiation used.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant<int, Id>  id_type;
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  Find the composite remainder update effect from a fixed bit
 | 
						|
          sequence, for each potential sequence combination.
 | 
						|
 | 
						|
        For each value between 0 and 2<sup><var>SubOrder</var></sup> - 1,
 | 
						|
        computes the XOR mask corresponding to the composite effect they update
 | 
						|
        the incoming remainder, which is the upper part of the dividend that
 | 
						|
        gets (partially) pushed out of its register by the incoming value's
 | 
						|
        bits.  The composite value merges the \"partial products\" from each bit
 | 
						|
        of the value being updated individually.
 | 
						|
 | 
						|
        \pre  \a Register is a built-in unsigned integer type
 | 
						|
        \pre  0 \< \a SubOrder \<= \a register_length \<=
 | 
						|
          std\::numeric_limits\<\a Register\>\::digits
 | 
						|
 | 
						|
        \tparam SubOrder  The number of low-order significant bits of the trial
 | 
						|
          new dividends.
 | 
						|
        \tparam Register  The type used for representing the remainder and
 | 
						|
          divisor modulo-2 polynomials.  The bit at <code>2<sup>i</sup></code>
 | 
						|
          is used as the coefficient of <i>x<sup>i</sup></i>.
 | 
						|
 | 
						|
        \param[in] register_length  The number of significant low-order bits
 | 
						|
          to be used from \a Register values.  It is the order of the modulo-2
 | 
						|
          polynomial remainder and one less than the divisor's order.
 | 
						|
        \param[in] truncated_divisor  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \param[in] reflect  If \c false, read from the highest-order marked
 | 
						|
          bit from a new dividend's bits and go down, as normal.  Otherwise,
 | 
						|
          proceed from the lowest-order bit and go up.
 | 
						|
 | 
						|
        \return  An array such that the element at index <var>i</var> is the
 | 
						|
          composite effect XOR mask for value <var>i</var>.
 | 
						|
 | 
						|
        \note  This routine performs a modulo-2 polynomial division variant.
 | 
						|
          The exclusive-or operations are applied in a different order, since
 | 
						|
          that kind of operation is commutative and associative.  It also
 | 
						|
          assumes that the zero-valued augment string was applied before this
 | 
						|
          step, which means that the updated remainder can be directly used as
 | 
						|
          the final CRC.
 | 
						|
        \todo  Check that using the unaugmented-CRC division routines give the
 | 
						|
          same composite mask table as using augmented-CRC routines.
 | 
						|
     */
 | 
						|
    template < int SubOrder, typename Register >
 | 
						|
    boost::array< Register, (UINTMAX_C( 1 ) << SubOrder) >
 | 
						|
    make_partial_xor_products_table( int register_length, Register
 | 
						|
     truncated_divisor, bool reflect )
 | 
						|
    {
 | 
						|
        boost::array<Register, ( UINTMAX_C(1) << SubOrder )>  result;
 | 
						|
 | 
						|
        // Loop over every possible dividend value
 | 
						|
        for ( typename boost::uint_t<SubOrder + 1>::fast  dividend = 0u;
 | 
						|
         dividend < result.size() ; ++dividend )
 | 
						|
        {
 | 
						|
            Register  remainder = 0u;
 | 
						|
 | 
						|
            crc_modulo_word_update( register_length, remainder, dividend,
 | 
						|
             truncated_divisor, SubOrder, false );
 | 
						|
            result[ reflect_optionally(dividend, reflect, SubOrder) ] =
 | 
						|
             reflect_optionally( remainder, reflect, register_length );
 | 
						|
        }
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
 | 
						|
    /** \brief  A mix-in class for the table of table-driven CRC algorithms
 | 
						|
 | 
						|
        Encapsulates the parameters need to make a global (technically,
 | 
						|
        class-static) table usuable in CRC algorithms, and generates said
 | 
						|
        table.
 | 
						|
 | 
						|
        \pre  0 \< \a SubOrder \<= Order \<=
 | 
						|
          std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam SubOrder  The number of low-order significant bits of the trial
 | 
						|
          new dividends.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \tparam Reflect  If \c false, read from the highest-order marked
 | 
						|
          bit from a new dividend's bits and go down, as normal.  Otherwise,
 | 
						|
          proceed from the lowest-order bit and go up.
 | 
						|
     */
 | 
						|
    template < int Order, int SubOrder, boost::uintmax_t TruncatedPolynomial,
 | 
						|
     bool Reflect >
 | 
						|
    class crc_table_t
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for register bit length
 | 
						|
 | 
						|
            This is a Boost integral constant indicating how many
 | 
						|
            significant bits are in the remainder and (truncated) divisor.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< int, Order >              width_c;
 | 
						|
        /** \brief  The type to check for index-unit bit length
 | 
						|
 | 
						|
            This is a Boost integral constant indicating how many
 | 
						|
            significant bits are in the trial new dividends.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< int, SubOrder >      unit_width_c;
 | 
						|
        /** \brief  The type of registers
 | 
						|
 | 
						|
            This is the output type for the partial-product map.
 | 
						|
         */
 | 
						|
        typedef typename boost::uint_t< Order >::fast          value_type;
 | 
						|
        /** \brief  The type to check the divisor
 | 
						|
 | 
						|
            This is a Boost integral constant representing the (truncated)
 | 
						|
            divisor.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< value_type, TruncatedPolynomial >
 | 
						|
          poly_c;
 | 
						|
        /** \brief  The type to check for reflection
 | 
						|
 | 
						|
            This is a Boost integral constant representing whether input
 | 
						|
            units should be read in reverse order.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant< bool, Reflect >           refin_c;
 | 
						|
        /** \brief  The type to check for map size
 | 
						|
 | 
						|
            This is a Boost integral constant representing the number of
 | 
						|
            elements in the partial-product map, based on the unit size.
 | 
						|
         */
 | 
						|
        typedef high_bit_mask_c< SubOrder >                  table_size_c;
 | 
						|
        /** \brief  The type of the unit TO partial-product map
 | 
						|
 | 
						|
            This is the array type that takes units as the index and said unit's
 | 
						|
            composite partial-product mask as the element.
 | 
						|
         */
 | 
						|
        typedef boost::array<value_type, table_size_c::value>  array_type;
 | 
						|
        /** \brief  Create a global array for the mapping table
 | 
						|
 | 
						|
            Creates an instance of a partial-product array with this class's
 | 
						|
            parameters.
 | 
						|
 | 
						|
            \return  A reference to a immutable array giving the partial-product
 | 
						|
              update XOR map for each potential sub-unit value.
 | 
						|
         */
 | 
						|
        static  array_type const &  get_table()
 | 
						|
        {
 | 
						|
            static  array_type const  table =
 | 
						|
             make_partial_xor_products_table<unit_width_c::value>(
 | 
						|
             width_c::value, poly_c::value, refin_c::value );
 | 
						|
 | 
						|
            return table;
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that handles direct (i.e. non-reflected) byte-fed
 | 
						|
          table-driven CRC algorithms
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes aren't
 | 
						|
        reflected before processing.
 | 
						|
 | 
						|
        \pre  \c CHAR_BIT \<= \a Order \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial >
 | 
						|
    class direct_byte_table_driven_crcs
 | 
						|
        : public crc_table_t<Order, CHAR_BIT, TruncatedPolynomial, false>
 | 
						|
    {
 | 
						|
        typedef crc_table_t<Order, CHAR_BIT, TruncatedPolynomial, false>
 | 
						|
          base_type;
 | 
						|
 | 
						|
    public:
 | 
						|
        typedef typename base_type::value_type  value_type;
 | 
						|
        typedef typename base_type::array_type  array_type;
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            augmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated remainder
 | 
						|
         */
 | 
						|
        static  value_type  augmented_crc_update( value_type remainder, unsigned
 | 
						|
         char const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Locates the merged partial product based on the leading byte
 | 
						|
                unsigned char const  index = ( remainder >> (Order - CHAR_BIT) )
 | 
						|
                 & UCHAR_MAX;
 | 
						|
 | 
						|
                // Complete the multi-bit modulo-2 polynomial division
 | 
						|
                remainder <<= CHAR_BIT;
 | 
						|
                remainder |= *new_dividend_bytes++;
 | 
						|
                remainder ^= table.elems[ index ];
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            unaugmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated remainder
 | 
						|
         */
 | 
						|
        static  value_type  crc_update( value_type remainder, unsigned char
 | 
						|
         const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Locates the merged partial product based on comparing the
 | 
						|
                // leading and incoming bytes
 | 
						|
                unsigned char const  index = ( (remainder >> ( Order - CHAR_BIT
 | 
						|
                 )) & UCHAR_MAX ) ^ *new_dividend_bytes++;
 | 
						|
 | 
						|
                // Complete the multi-bit altered modulo-2 polynomial division
 | 
						|
                remainder <<= CHAR_BIT;
 | 
						|
                remainder ^= table.elems[ index ];
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that handles reflected byte-fed, table-driven CRC
 | 
						|
          algorithms
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes are
 | 
						|
        reflected before processing.
 | 
						|
 | 
						|
        \pre  \c CHAR_BIT \<= \a Order \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial >
 | 
						|
    class reflected_byte_table_driven_crcs
 | 
						|
        : public crc_table_t<Order, CHAR_BIT, TruncatedPolynomial, true>
 | 
						|
    {
 | 
						|
        typedef crc_table_t<Order, CHAR_BIT, TruncatedPolynomial, true>
 | 
						|
          base_type;
 | 
						|
 | 
						|
    public:
 | 
						|
        typedef typename base_type::value_type  value_type;
 | 
						|
        typedef typename base_type::array_type  array_type;
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            reflecting augmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder; since the bytes are
 | 
						|
              being reflected, this remainder also has to be reflected
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated, reflected remainder
 | 
						|
         */
 | 
						|
        static  value_type  augmented_crc_update( value_type remainder, unsigned
 | 
						|
         char const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Locates the merged partial product based on the leading byte
 | 
						|
                // (which is at the low-order end for reflected remainders)
 | 
						|
                unsigned char const  index = remainder & UCHAR_MAX;
 | 
						|
 | 
						|
                // Complete the multi-bit reflected modulo-2 polynomial division
 | 
						|
                remainder >>= CHAR_BIT;
 | 
						|
                remainder |= static_cast<value_type>( *new_dividend_bytes++ )
 | 
						|
                 << ( Order - CHAR_BIT );
 | 
						|
                remainder ^= table.elems[ index ];
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            reflected unaugmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder; since the bytes are
 | 
						|
              being reflected, this remainder also has to be reflected
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated, reflected remainder
 | 
						|
         */
 | 
						|
        static  value_type  crc_update( value_type remainder, unsigned char
 | 
						|
         const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Locates the merged partial product based on comparing the
 | 
						|
                // leading and incoming bytes
 | 
						|
                unsigned char const  index = ( remainder & UCHAR_MAX ) ^
 | 
						|
                 *new_dividend_bytes++;
 | 
						|
 | 
						|
                // Complete the multi-bit reflected altered modulo-2 polynomial
 | 
						|
                // division
 | 
						|
                remainder >>= CHAR_BIT;
 | 
						|
                remainder ^= table.elems[ index ];
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  Mix-in class for byte-fed, table-driven CRC algorithms with
 | 
						|
          parameter values at least a byte in width
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes may be
 | 
						|
        reflected before processing, controlled by a compile-time parameter.
 | 
						|
 | 
						|
        \pre  \c CHAR_BIT \<= \a Order \<= \c std\::numeric_limits\<uintmax_t\>
 | 
						|
          \::digits
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \tparam Reflect  If \c false, read from the highest-order bit from a new
 | 
						|
          input byte and go down, as normal.  Otherwise, proceed from the
 | 
						|
          lowest-order bit and go up.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial, bool Reflect >
 | 
						|
    class byte_table_driven_crcs
 | 
						|
        : public boost::conditional< Reflect,
 | 
						|
          reflected_byte_table_driven_crcs<Order, TruncatedPolynomial>,
 | 
						|
          direct_byte_table_driven_crcs<Order, TruncatedPolynomial> >::type
 | 
						|
    { };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that handles direct (i.e. non-reflected) byte-fed
 | 
						|
          CRC algorithms for sub-byte parameters
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes aren't
 | 
						|
        reflected before processing.
 | 
						|
 | 
						|
        \pre  0 \< \a Order \< \c CHAR_BIT
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial >
 | 
						|
    class direct_sub_byte_crcs
 | 
						|
        : public crc_table_t<Order, Order, TruncatedPolynomial, false>
 | 
						|
    {
 | 
						|
        typedef crc_table_t<Order, Order, TruncatedPolynomial, false>
 | 
						|
          base_type;
 | 
						|
 | 
						|
    public:
 | 
						|
        typedef typename base_type::width_c     width_c;
 | 
						|
        typedef typename base_type::value_type  value_type;
 | 
						|
        typedef typename base_type::poly_c       poly_c;
 | 
						|
        typedef typename base_type::array_type  array_type;
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            augmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated remainder
 | 
						|
 | 
						|
            \todo  Use this function somewhere so I can test it.
 | 
						|
         */
 | 
						|
        static  value_type  augmented_crc_update( value_type remainder, unsigned
 | 
						|
         char const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            //static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Without a table, process each byte explicitly
 | 
						|
                augmented_crc_modulo_word_update( width_c::value, remainder,
 | 
						|
                 *new_dividend_bytes++, poly_c::value, CHAR_BIT, false );
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            unaugmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated remainder
 | 
						|
         */
 | 
						|
        static  value_type  crc_update( value_type remainder, unsigned char
 | 
						|
         const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            //static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Without a table, process each byte explicitly
 | 
						|
                crc_modulo_word_update( width_c::value, remainder,
 | 
						|
                 *new_dividend_bytes++, poly_c::value, CHAR_BIT, false );
 | 
						|
            }
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  A mix-in class that handles reflected byte-fed, CRC algorithms
 | 
						|
          for sub-byte parameters
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes are
 | 
						|
        reflected before processing.
 | 
						|
 | 
						|
        \pre  0 \< \a Order \< \c CHAR_BIT
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial >
 | 
						|
    class reflected_sub_byte_crcs
 | 
						|
        : public crc_table_t<Order, Order, TruncatedPolynomial, true>
 | 
						|
    {
 | 
						|
        typedef crc_table_t<Order, Order, TruncatedPolynomial, true>
 | 
						|
          base_type;
 | 
						|
 | 
						|
    public:
 | 
						|
        typedef typename base_type::width_c     width_c;
 | 
						|
        typedef typename base_type::value_type  value_type;
 | 
						|
        typedef typename base_type::poly_c       poly_c;
 | 
						|
        typedef typename base_type::array_type  array_type;
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            reflecting augmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder; since the bytes are
 | 
						|
              being reflected, this remainder also has to be reflected
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated, reflected remainder
 | 
						|
 | 
						|
            \todo  Use this function somewhere so I can test it.
 | 
						|
         */
 | 
						|
        static  value_type  augmented_crc_update( value_type remainder, unsigned
 | 
						|
         char const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            //static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            remainder = reflect_sub_byte( remainder, width_c::value );
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Without a table, process each byte explicitly
 | 
						|
                augmented_crc_modulo_word_update( width_c::value, remainder,
 | 
						|
                 *new_dividend_bytes++, poly_c::value, CHAR_BIT, true );
 | 
						|
            }
 | 
						|
            remainder = reflect_sub_byte( remainder, width_c::value );
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
 | 
						|
        /** \brief  Compute the updated remainder after reading some bytes
 | 
						|
 | 
						|
            The implementation reads from a table to speed-up applying
 | 
						|
            reflected unaugmented-CRC updates byte-wise.
 | 
						|
 | 
						|
            \param remainder  The pre-update remainder; since the bytes are
 | 
						|
              being reflected, this remainder also has to be reflected
 | 
						|
            \param new_dividend_bytes  The address where the new bytes start
 | 
						|
            \param new_dividend_byte_count  The number of new bytes to read
 | 
						|
 | 
						|
            \return  The updated, reflected remainder
 | 
						|
         */
 | 
						|
        static  value_type  crc_update( value_type remainder, unsigned char
 | 
						|
         const *new_dividend_bytes, std::size_t new_dividend_byte_count)
 | 
						|
        {
 | 
						|
            //static  array_type const &  table = base_type::get_table();
 | 
						|
 | 
						|
            remainder = reflect_sub_byte( remainder, width_c::value );
 | 
						|
            while ( new_dividend_byte_count-- )
 | 
						|
            {
 | 
						|
                // Without a table, process each byte explicitly
 | 
						|
                crc_modulo_word_update( width_c::value, remainder,
 | 
						|
                 *new_dividend_bytes++, poly_c::value, CHAR_BIT, true );
 | 
						|
            }
 | 
						|
            remainder = reflect_sub_byte( remainder, width_c::value );
 | 
						|
 | 
						|
            return remainder;
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    /** \brief  Mix-in class for byte-fed, table-driven CRC algorithms with
 | 
						|
          sub-byte parameters
 | 
						|
 | 
						|
        This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes may be
 | 
						|
        reflected before processing, controlled by a compile-time parameter.
 | 
						|
 | 
						|
        \pre  0 \< \a Order \< \c CHAR_BIT
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \tparam Reflect  If \c false, read from the highest-order bit from a new
 | 
						|
          input byte and go down, as normal.  Otherwise, proceed from the
 | 
						|
          lowest-order bit and go up.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial, bool Reflect >
 | 
						|
    class sub_byte_crcs
 | 
						|
        : public boost::conditional< Reflect,
 | 
						|
          reflected_sub_byte_crcs<Order, TruncatedPolynomial>,
 | 
						|
          direct_sub_byte_crcs<Order, TruncatedPolynomial> >::type
 | 
						|
    { };
 | 
						|
 | 
						|
    /** This class template adds member functions #augmented_crc_update and
 | 
						|
        #crc_update to update remainders from new input bytes.  The bytes may be
 | 
						|
        reflected before processing, controlled by a compile-time parameter.
 | 
						|
 | 
						|
        \pre  0 \< \a Order \<= \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
        \tparam Order  The order of the modulo-2 polynomial remainder and one
 | 
						|
          less than the divisor's order.
 | 
						|
        \tparam TruncatedPolynomial  The lowest coefficients of the divisor
 | 
						|
          polynomial.  The highest-order coefficient is omitted and always
 | 
						|
          assumed to be 1.
 | 
						|
        \tparam Reflect  If \c false, read from the highest-order bit from a new
 | 
						|
          input byte and go down, as normal.  Otherwise, proceed from the
 | 
						|
          lowest-order bit and go up.
 | 
						|
        \tparam Id  An extra differentiator if multiple copies of this class
 | 
						|
          template are mixed-in as base classes.  Defaults to 0 if omitted.
 | 
						|
     */
 | 
						|
    template < int Order, boost::uintmax_t TruncatedPolynomial, bool Reflect,
 | 
						|
     int Id >
 | 
						|
    class crc_driver
 | 
						|
        : public boost::conditional< (Order < CHAR_BIT), sub_byte_crcs<Order,
 | 
						|
          TruncatedPolynomial, Reflect>, byte_table_driven_crcs<Order,
 | 
						|
          TruncatedPolynomial, Reflect> >::type
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        /** \brief  The type to check for ID
 | 
						|
 | 
						|
            This is a Boost integral constant indicating what ID number this
 | 
						|
            instantiation used.
 | 
						|
         */
 | 
						|
        typedef boost::integral_constant<int, Id>  id_type;
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
}  // namespace detail
 | 
						|
//! \endcond
 | 
						|
 | 
						|
 | 
						|
//  Simple CRC class function definitions  -----------------------------------//
 | 
						|
 | 
						|
/** Constructs a \c crc_basic object with at least the required parameters to a
 | 
						|
    particular CRC formula to be processed upon receiving input.
 | 
						|
 | 
						|
    \param[in] truncated_polynomial  The lowest coefficients of the divisor
 | 
						|
      polynomial.  The highest-order coefficient is omitted and always assumed
 | 
						|
      to be 1.  (\e Poly from the RMCA)
 | 
						|
    \param[in] initial_remainder  The (unaugmented) initial state of the
 | 
						|
      polynomial remainder.  Defaults to \c 0 if omitted.  (\e Init from the
 | 
						|
      RMCA)
 | 
						|
    \param[in] final_xor_value  The (XOR) bit-mask to be applied to the output
 | 
						|
      remainder, after possible reflection but before returning.  Defaults to
 | 
						|
      \c 0 (i.e. no bit changes) if omitted.  (\e XorOut from the RMCA)
 | 
						|
    \param[in] reflect_input  If \c true, input bytes are read lowest-order bit
 | 
						|
      first, otherwise highest-order bit first.  Defaults to \c false if
 | 
						|
      omitted.  (\e RefIn from the RMCA)
 | 
						|
    \param[in] reflect_remainder  If \c true, the output remainder is reflected
 | 
						|
      before the XOR-mask.  Defaults to \c false if omitted.  (\e RefOut from
 | 
						|
      the RMCA)
 | 
						|
 | 
						|
    \post  <code><var>truncated_polynomial</var> ==
 | 
						|
      this->get_truncated_polynominal()</code>
 | 
						|
    \post  <code><var>initial_remainder</var> ==
 | 
						|
      this->get_initial_remainder()</code>
 | 
						|
    \post  <code><var>final_xor_value</var> ==
 | 
						|
      this->get_final_xor_value()</code>
 | 
						|
    \post  <code><var>reflect_input</var> ==
 | 
						|
      this->get_reflect_input()</code>
 | 
						|
    \post  <code><var>reflect_remainder</var> ==
 | 
						|
      this->get_reflect_remainder()</code>
 | 
						|
    \post  <code><var>initial_remainder</var> ==
 | 
						|
      this->get_interim_remainder()</code>
 | 
						|
    \post  <code>(<var>reflect_remainder</var> ?
 | 
						|
      REFLECT(<var>initial_remainder</var>) : <var>initial_remainder</var>) ^
 | 
						|
      <var>final_xor_value</var> == this->checksum()</code>
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
crc_basic<Bits>::crc_basic
 | 
						|
(
 | 
						|
    value_type  truncated_polynomial,
 | 
						|
    value_type  initial_remainder,      // = 0
 | 
						|
    value_type  final_xor_value,        // = 0
 | 
						|
    bool        reflect_input,          // = false
 | 
						|
    bool        reflect_remainder       // = false
 | 
						|
)
 | 
						|
    : rem_( initial_remainder ), poly_( truncated_polynomial )
 | 
						|
    , init_( initial_remainder ), final_( final_xor_value )
 | 
						|
    , rft_in_( reflect_input ), rft_out_( reflect_remainder )
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
/** Returns a representation of the polynomial divisor.  The value of the
 | 
						|
    2<sup>i</sup> bit is the value of the coefficient of the polynomial's
 | 
						|
    x<sup>i</sup> term.  The omitted bit for x<sup>(#bit_count)</sup> term is
 | 
						|
    always 1.
 | 
						|
 | 
						|
    \return  The bit-packed list of coefficients.  If the bit-length of
 | 
						|
      #value_type exceeds #bit_count, the values of higher-placed bits should be
 | 
						|
      ignored (even any for x<sup>(#bit_count)</sup>) since they're unregulated.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
typename crc_basic<Bits>::value_type
 | 
						|
crc_basic<Bits>::get_truncated_polynominal
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return poly_;
 | 
						|
}
 | 
						|
 | 
						|
/** Returns a representation of the polynomial remainder before any input has
 | 
						|
    been submitted.  The value of the 2<sup>i</sup> bit is the value of the
 | 
						|
    coefficient of the polynomial's x<sup>i</sup> term.
 | 
						|
 | 
						|
    \return  The bit-packed list of coefficients.  If the bit-length of
 | 
						|
      #value_type exceeds #bit_count, the values of higher-placed bits should be
 | 
						|
      ignored since they're unregulated.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
typename crc_basic<Bits>::value_type
 | 
						|
crc_basic<Bits>::get_initial_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return init_;
 | 
						|
}
 | 
						|
 | 
						|
/** Returns the mask to be used during creation of a checksum.  The mask is used
 | 
						|
    for an exclusive-or (XOR) operation applied bit-wise to the interim
 | 
						|
    remainder representation (after any reflection, if #get_reflect_remainder()
 | 
						|
    returns \c true).
 | 
						|
 | 
						|
    \return  The bit-mask.  If the bit-length of #value_type exceeds #bit_count,
 | 
						|
      the values of higher-placed bits should be ignored since they're
 | 
						|
      unregulated.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
typename crc_basic<Bits>::value_type
 | 
						|
crc_basic<Bits>::get_final_xor_value
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return final_;
 | 
						|
}
 | 
						|
 | 
						|
/** Returns a whether or not a submitted byte will be \"reflected\" before it is
 | 
						|
    used to update the interim remainder.  Only the byte-wise operations
 | 
						|
    #process_byte, #process_block, and #process_bytes are affected.
 | 
						|
 | 
						|
    \retval true  Input bytes will be read starting from the lowest-order bit.
 | 
						|
    \retval false  Input bytes will be read starting from the highest-order bit.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
bool
 | 
						|
crc_basic<Bits>::get_reflect_input
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return rft_in_;
 | 
						|
}
 | 
						|
 | 
						|
/** Indicates if the interim remainder will be \"reflected\" before it is passed
 | 
						|
    to the XOR-mask stage when returning a checksum.
 | 
						|
 | 
						|
    \retval true  The interim remainder is reflected before further work.
 | 
						|
    \retval false  The interim remainder is applied to the XOR-mask as-is.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
bool
 | 
						|
crc_basic<Bits>::get_reflect_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return rft_out_;
 | 
						|
}
 | 
						|
 | 
						|
/** Returns a representation of the polynomial remainder after all the input
 | 
						|
    submissions since construction or the last #reset call.  The value of the
 | 
						|
    2<sup>i</sup> bit is the value of the coefficient of the polynomial's
 | 
						|
    x<sup>i</sup> term.  If CRC processing gets interrupted here, retain the
 | 
						|
    value returned, and use it to start up the next CRC computer where you left
 | 
						|
    off (with #reset(value_type) or construction).  The next computer has to
 | 
						|
    have its other parameters compatible with this computer.
 | 
						|
 | 
						|
    \return  The bit-packed list of coefficients.  If the bit-length of
 | 
						|
      #value_type exceeds #bit_count, the values of higher-placed bits should be
 | 
						|
      ignored since they're unregulated.  No output processing (reflection or
 | 
						|
      XOR mask) has been applied to the value.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
typename crc_basic<Bits>::value_type
 | 
						|
crc_basic<Bits>::get_interim_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return rem_ & detail::low_bits_mask_c<bit_count>::value;
 | 
						|
}
 | 
						|
 | 
						|
/** Changes the interim polynomial remainder to \a new_rem, purging any
 | 
						|
    influence previously submitted input has had.  The value of the
 | 
						|
    2<sup>i</sup> bit is the value of the coefficient of the polynomial's
 | 
						|
    x<sup>i</sup> term.
 | 
						|
 | 
						|
    \param[in] new_rem  The (unaugmented) state of the polynomial remainder
 | 
						|
      starting from this point, with no output processing applied.
 | 
						|
 | 
						|
    \post  <code><var>new_rem</var> == this->get_interim_remainder()</code>
 | 
						|
    \post  <code>((this->get_reflect_remainder() ?
 | 
						|
      REFLECT(<var>new_rem</var>) : <var>new_rem</var>) ^
 | 
						|
      this->get_final_xor_value()) == this->checksum()</code>
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
void
 | 
						|
crc_basic<Bits>::reset
 | 
						|
(
 | 
						|
    value_type  new_rem
 | 
						|
)
 | 
						|
{
 | 
						|
    rem_ = new_rem;
 | 
						|
}
 | 
						|
 | 
						|
/** Changes the interim polynomial remainder to the initial remainder given
 | 
						|
    during construction, purging any influence previously submitted input has
 | 
						|
    had.  The value of the 2<sup>i</sup> bit is the value of the coefficient of
 | 
						|
    the polynomial's x<sup>i</sup> term.
 | 
						|
 | 
						|
    \post  <code>this->get_initial_remainder() ==
 | 
						|
      this->get_interim_remainder()</code>
 | 
						|
    \post  <code>((this->get_reflect_remainder() ?
 | 
						|
      REFLECT(this->get_initial_remainder()) :
 | 
						|
      this->get_initial_remainder()) ^ this->get_final_xor_value())
 | 
						|
      == this->checksum()</code>
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
void
 | 
						|
crc_basic<Bits>::reset
 | 
						|
(
 | 
						|
)
 | 
						|
{
 | 
						|
    this->reset( this->get_initial_remainder() );
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with a single altered-CRC-division step.
 | 
						|
 | 
						|
    \param[in] bit  The new input bit.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though a modulo-2 polynomial
 | 
						|
      division, where the division steps are altered for unaugmented CRCs.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
void
 | 
						|
crc_basic<Bits>::process_bit
 | 
						|
(
 | 
						|
    bool  bit
 | 
						|
)
 | 
						|
{
 | 
						|
    detail::crc_modulo_update( bit_count, rem_, bit, poly_ );
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with several altered-CRC-division steps.  Each
 | 
						|
    bit is processed separately, starting from the one at the
 | 
						|
    2<sup><var>bit_length</var> - 1</sup> place, then proceeding down to the
 | 
						|
    lowest-placed bit.  Any order imposed by
 | 
						|
    <code>this->get_reflect_input()</code> is ignored.
 | 
						|
 | 
						|
    \pre  0 \< \a bit_length \<= \c CHAR_BIT
 | 
						|
 | 
						|
    \param[in] bits  The byte containing the new input bits.
 | 
						|
    \param[in] bit_length  The number of bits in the byte to be read.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though \a bit_length modulo-2
 | 
						|
      polynomial divisions, where the division steps are altered for unaugmented
 | 
						|
      CRCs.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
void
 | 
						|
crc_basic<Bits>::process_bits
 | 
						|
(
 | 
						|
    unsigned char  bits,
 | 
						|
    std::size_t    bit_length
 | 
						|
)
 | 
						|
{
 | 
						|
    // ignore the bits above the ones we want
 | 
						|
    bits <<= CHAR_BIT - bit_length;
 | 
						|
 | 
						|
    // compute the CRC for each bit, starting with the upper ones
 | 
						|
    unsigned char const  high_bit_mask = 1u << ( CHAR_BIT - 1u );
 | 
						|
    for ( std::size_t i = bit_length ; i > 0u ; --i, bits <<= 1u )
 | 
						|
    {
 | 
						|
        process_bit( static_cast<bool>(bits & high_bit_mask) );
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with a byte's worth of altered-CRC-division
 | 
						|
    steps.  The bits within the byte are processed from the highest place down
 | 
						|
    if <code>this->get_reflect_input()</code> is \c false, and lowest place
 | 
						|
    up otherwise.
 | 
						|
 | 
						|
    \param[in] byte  The new input byte.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though \c CHAR_BIT modulo-2
 | 
						|
      polynomial divisions, where the division steps are altered for unaugmented
 | 
						|
      CRCs.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
void
 | 
						|
crc_basic<Bits>::process_byte
 | 
						|
(
 | 
						|
    unsigned char  byte
 | 
						|
)
 | 
						|
{
 | 
						|
    process_bits( (rft_in_ ? detail::reflect_byte( byte ) : byte), CHAR_BIT );
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with several bytes' worth of
 | 
						|
    altered-CRC-division steps.  The bits within each byte are processed from
 | 
						|
    the highest place down if <code>this->get_reflect_input()</code> is
 | 
						|
    \c false, and lowest place up otherwise.  The bytes themselves are processed
 | 
						|
    starting from the one pointed by \a bytes_begin until \a bytes_end is
 | 
						|
    reached through forward iteration, treating the two pointers as if they
 | 
						|
    point to <code>unsigned char</code> objects.
 | 
						|
 | 
						|
    \pre  \a bytes_end has to equal \a bytes_begin if the latter is \c NULL or
 | 
						|
      otherwise doesn't point to a valid buffer.
 | 
						|
    \pre  \a bytes_end, if not equal to \a bytes_begin, has to point within or
 | 
						|
      one-byte-past the same buffer \a bytes_begin points into.
 | 
						|
    \pre  \a bytes_end has to be reachable from \a bytes_begin through a finite
 | 
						|
      number of forward byte-pointer increments.
 | 
						|
 | 
						|
    \param[in] bytes_begin  The address where the memory block begins.
 | 
						|
    \param[in] bytes_end  Points to one-byte past the address of the memory
 | 
						|
      block's last byte, or \a bytes_begin if no bytes are to be read.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though <code>CHAR_BIT * (((unsigned
 | 
						|
      char const *) bytes_end) - ((unsigned char const *) bytes_begin))</code>
 | 
						|
      modulo-2 polynomial divisions, where the division steps are altered for
 | 
						|
      unaugmented CRCs.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
void
 | 
						|
crc_basic<Bits>::process_block
 | 
						|
(
 | 
						|
    void const *  bytes_begin,
 | 
						|
    void const *  bytes_end
 | 
						|
)
 | 
						|
{
 | 
						|
    for ( unsigned char const * p
 | 
						|
     = static_cast<unsigned char const *>(bytes_begin) ; p < bytes_end ; ++p )
 | 
						|
    {
 | 
						|
        process_byte( *p );
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with several bytes' worth of
 | 
						|
    altered-CRC-division steps.  The bits within each byte are processed from
 | 
						|
    the highest place down if <code>this->get_reflect_input()</code> is
 | 
						|
    \c false, and lowest place up otherwise.  The bytes themselves are processed
 | 
						|
    starting from the one pointed by \a buffer, forward-iterated (as if the
 | 
						|
    pointed-to objects were of <code>unsigned char</code>) until \a byte_count
 | 
						|
    bytes are read.
 | 
						|
 | 
						|
    \pre  \a byte_count has to equal 0 if \a buffer is \c NULL or otherwise
 | 
						|
      doesn't point to valid memory.
 | 
						|
    \pre  If \a buffer points within valid memory, then that block has to have
 | 
						|
      at least \a byte_count more valid bytes allocated from that point.
 | 
						|
 | 
						|
    \param[in] buffer  The address where the memory block begins.
 | 
						|
    \param[in] byte_count  The number of bytes in the memory block.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though <code>CHAR_BIT *
 | 
						|
      <var>byte_count</var></code> modulo-2 polynomial divisions, where the
 | 
						|
      division steps are altered for unaugmented CRCs.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
void
 | 
						|
crc_basic<Bits>::process_bytes
 | 
						|
(
 | 
						|
    void const *  buffer,
 | 
						|
    std::size_t   byte_count
 | 
						|
)
 | 
						|
{
 | 
						|
    unsigned char const * const  b = static_cast<unsigned char const *>(
 | 
						|
     buffer );
 | 
						|
 | 
						|
    process_block( b, b + byte_count );
 | 
						|
}
 | 
						|
 | 
						|
/** Computes the checksum of all the submitted bits since construction or the
 | 
						|
    last call to #reset.  The checksum will be the raw checksum, i.e. the
 | 
						|
    (interim) remainder after all the modulo-2 polynomial division, plus any
 | 
						|
    output processing.
 | 
						|
 | 
						|
    \return  <code>(this->get_reflect_remainder() ?
 | 
						|
      REFLECT(this->get_interim_remainder()) :
 | 
						|
      this->get_interim_remainder()) ^ this->get_final_xor_value()</code>
 | 
						|
 | 
						|
    \note  Since checksums are meant to be compared, any higher-placed bits
 | 
						|
      (when the bit-length of #value_type exceeds #bit_count) will be set to 0.
 | 
						|
 */
 | 
						|
template < std::size_t Bits >
 | 
						|
inline
 | 
						|
typename crc_basic<Bits>::value_type
 | 
						|
crc_basic<Bits>::checksum
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return ( (rft_out_ ? detail::reflect_unsigned( rem_, bit_count ) :
 | 
						|
     rem_) ^ final_ ) & detail::low_bits_mask_c<bit_count>::value;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//  Optimized CRC class function definitions  --------------------------------//
 | 
						|
 | 
						|
// Macro to compact code
 | 
						|
#define BOOST_CRC_OPTIMAL_NAME  crc_optimal<Bits, TruncPoly, InitRem, \
 | 
						|
 FinalXor, ReflectIn, ReflectRem>
 | 
						|
 | 
						|
/** Constructs a \c crc_optimal object with a particular CRC formula to be
 | 
						|
    processed upon receiving input.  The initial remainder may be overridden.
 | 
						|
 | 
						|
    \param[in] init_rem  The (unaugmented) initial state of the polynomial
 | 
						|
      remainder.  Defaults to #initial_remainder if omitted.
 | 
						|
 | 
						|
    \post  <code>#truncated_polynominal ==
 | 
						|
      this->get_truncated_polynominal()</code>
 | 
						|
    \post  <code>#initial_remainder == this->get_initial_remainder()</code>
 | 
						|
    \post  <code>#final_xor_value == this->get_final_xor_value()</code>
 | 
						|
    \post  <code>#reflect_input == this->get_reflect_input()</code>
 | 
						|
    \post  <code>#reflect_remainder == this->get_reflect_remainder()</code>
 | 
						|
    \post  <code><var>init_rem</var> == this->get_interim_remainder()</code>
 | 
						|
    \post  <code>(#reflect_remainder ? REFLECT(<var>init_rem</var>) :
 | 
						|
      <var>init_rem</var>) ^ #final_xor_value == this->checksum()</code>
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
BOOST_CRC_OPTIMAL_NAME::crc_optimal
 | 
						|
(
 | 
						|
    value_type  init_rem  // = initial_remainder
 | 
						|
)
 | 
						|
    : rem_( reflect_i_type::reflect_q(init_rem) )
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_truncated_polynominal
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_truncated_polynominal
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return truncated_polynominal;
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_initial_remainder
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_initial_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return initial_remainder;
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_final_xor_value
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_final_xor_value
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return final_xor_value;
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_reflect_input
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
bool
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_reflect_input
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return reflect_input;
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_reflect_remainder
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
bool
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_reflect_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return reflect_remainder;
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::get_interim_remainder
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::get_interim_remainder
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    // Interim remainder should be _un_-reflected, so we have to undo it.
 | 
						|
    return reflect_i_type::reflect_q( rem_ ) &
 | 
						|
     detail::low_bits_mask_c<bit_count>::value;
 | 
						|
}
 | 
						|
 | 
						|
/** Changes the interim polynomial remainder to \a new_rem, purging any
 | 
						|
    influence previously submitted input has had.  The value of the
 | 
						|
    2<sup>i</sup> bit is the value of the coefficient of the polynomial's
 | 
						|
    x<sup>i</sup> term.
 | 
						|
 | 
						|
    \param[in] new_rem  The (unaugmented) state of the polynomial remainder
 | 
						|
      starting from this point, with no output processing applied.  Defaults to
 | 
						|
      <code>this->get_initial_remainder()</code> if omitted.
 | 
						|
 | 
						|
    \post  <code><var>new_rem</var> == this->get_interim_remainder()</code>
 | 
						|
    \post  <code>((this->get_reflect_remainder() ?
 | 
						|
      REFLECT(<var>new_rem</var>) : <var>new_rem</var>) ^
 | 
						|
      this->get_final_xor_value()) == this->checksum()</code>
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
void
 | 
						|
BOOST_CRC_OPTIMAL_NAME::reset
 | 
						|
(
 | 
						|
    value_type  new_rem  // = initial_remainder
 | 
						|
)
 | 
						|
{
 | 
						|
    rem_ = reflect_i_type::reflect_q( new_rem );
 | 
						|
}
 | 
						|
 | 
						|
/** \copydetails  boost::crc_basic::process_byte
 | 
						|
 | 
						|
    \note  Any modulo-2 polynomial divisions may use a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) to speed computation when reading data
 | 
						|
      byte-wise.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
void
 | 
						|
BOOST_CRC_OPTIMAL_NAME::process_byte
 | 
						|
(
 | 
						|
    unsigned char  byte
 | 
						|
)
 | 
						|
{
 | 
						|
    process_bytes( &byte, sizeof(byte) );
 | 
						|
}
 | 
						|
 | 
						|
/** \copydetails  boost::crc_basic::process_block
 | 
						|
 | 
						|
    \note  Any modulo-2 polynomial divisions may use a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) to speed computation when reading data
 | 
						|
      byte-wise.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
void
 | 
						|
BOOST_CRC_OPTIMAL_NAME::process_block
 | 
						|
(
 | 
						|
    void const *  bytes_begin,
 | 
						|
    void const *  bytes_end
 | 
						|
)
 | 
						|
{
 | 
						|
    process_bytes( bytes_begin, static_cast<unsigned char const *>(bytes_end) -
 | 
						|
     static_cast<unsigned char const *>(bytes_begin) );
 | 
						|
}
 | 
						|
 | 
						|
/** \copydetails  boost::crc_basic::process_bytes
 | 
						|
 | 
						|
    \note  Any modulo-2 polynomial divisions may use a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) to speed computation when reading data
 | 
						|
      byte-wise.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
void
 | 
						|
BOOST_CRC_OPTIMAL_NAME::process_bytes
 | 
						|
(
 | 
						|
    void const *   buffer,
 | 
						|
    std::size_t  byte_count
 | 
						|
)
 | 
						|
{
 | 
						|
    rem_ = crc_table_type::crc_update( rem_, static_cast<unsigned char const
 | 
						|
     *>(buffer), byte_count );
 | 
						|
}
 | 
						|
 | 
						|
//! \copydetails  boost::crc_basic::checksum
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::checksum
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return ( reflect_o_type::reflect_q(rem_) ^ get_final_xor_value() )
 | 
						|
     & detail::low_bits_mask_c<bit_count>::value;
 | 
						|
}
 | 
						|
 | 
						|
/** Updates the interim remainder with a byte's worth of altered-CRC-division
 | 
						|
    steps.  The bits within the byte are processed from the highest place down
 | 
						|
    if <code>this->get_reflect_input()</code> is \c false, and lowest place
 | 
						|
    up otherwise.  This function is meant to present a function-object interface
 | 
						|
    to code that wants to process a stream of bytes with
 | 
						|
    <code>std::for_each</code> or similar range-processing algorithms.  Since
 | 
						|
    some of these algorithms takes their function object by value, make sure to
 | 
						|
    copy back the result to this object so the updates can be remembered.
 | 
						|
 | 
						|
    \param[in] byte  The new input byte.
 | 
						|
 | 
						|
    \post  The interim remainder is updated though \c CHAR_BIT modulo-2
 | 
						|
      polynomial divisions, where the division steps are altered for unaugmented
 | 
						|
      CRCs.
 | 
						|
 | 
						|
    \note  Any modulo-2 polynomial divisions may use a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) to speed computation when reading data
 | 
						|
      byte-wise.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
void
 | 
						|
BOOST_CRC_OPTIMAL_NAME::operator ()
 | 
						|
(
 | 
						|
    unsigned char  byte
 | 
						|
)
 | 
						|
{
 | 
						|
    process_byte( byte );
 | 
						|
}
 | 
						|
 | 
						|
/** Computes the checksum of all the submitted bits since construction or the
 | 
						|
    last call to #reset.  The checksum will be the raw checksum, i.e. the
 | 
						|
    (interim) remainder after all the modulo-2 polynomial division, plus any
 | 
						|
    output processing.  This function is meant to present a function-object
 | 
						|
    interface to code that wants to receive data like
 | 
						|
    <code>std::generate_n</code> or similar data-processing algorithms.  Note
 | 
						|
    that if this object is used as a generator multiple times without an
 | 
						|
    intervening mutating operation, the same value will always be returned.
 | 
						|
 | 
						|
    \return  <code>(this->get_reflect_remainder() ?
 | 
						|
      REFLECT(this->get_interim_remainder()) :
 | 
						|
      this->get_interim_remainder()) ^ this->get_final_xor_value()</code>
 | 
						|
 | 
						|
    \note  Since checksums are meant to be compared, any higher-placed bits
 | 
						|
      (when the bit-length of #value_type exceeds #bit_count) will be set to 0.
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename BOOST_CRC_OPTIMAL_NAME::value_type
 | 
						|
BOOST_CRC_OPTIMAL_NAME::operator ()
 | 
						|
(
 | 
						|
) const
 | 
						|
{
 | 
						|
    return checksum();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//  CRC computation function definition  -------------------------------------//
 | 
						|
 | 
						|
/** Computes the polynomial remainder of a CRC run, assuming that \a buffer and
 | 
						|
    \a byte_count describe a memory block representing the polynomial dividend.
 | 
						|
    The division steps are altered so the result directly gives a checksum,
 | 
						|
    without need to augment the memory block with scratch-space bytes.  The
 | 
						|
    first byte is considered the highest order, going down for subsequent bytes.
 | 
						|
 | 
						|
    \pre  0 \< \a Bits \<= \c std\::numeric_limits\<uintmax_t\>\::digits
 | 
						|
 | 
						|
    \tparam Bits  The order of the modulo-2 polynomial divisor.  (\e Width from
 | 
						|
      the RMCA)
 | 
						|
    \tparam TruncPoly  The lowest coefficients of the divisor polynomial.  The
 | 
						|
      highest-order coefficient is omitted and always assumed to be 1.
 | 
						|
      (\e Poly from the RMCA)
 | 
						|
    \tparam InitRem  The (unaugmented) initial state of the polynomial
 | 
						|
      remainder.  (\e Init from the RMCA)
 | 
						|
    \tparam FinalXor  The (XOR) bit-mask to be applied to the output remainder,
 | 
						|
      after possible reflection but before returning.  (\e XorOut from the RMCA)
 | 
						|
    \tparam ReflectIn  If \c True, input bytes are read lowest-order bit first,
 | 
						|
      otherwise highest-order bit first.  (\e RefIn from the RMCA)
 | 
						|
    \tparam ReflectRem  If \c True, the output remainder is reflected before the
 | 
						|
      XOR-mask.  (\e RefOut from the RMCA)
 | 
						|
 | 
						|
    \param[in] buffer  The address where the memory block begins.
 | 
						|
    \param[in] byte_count  The number of bytes in the memory block.
 | 
						|
 | 
						|
    \return  The checksum, which is the last (interim) remainder plus any output
 | 
						|
      processing.
 | 
						|
 | 
						|
    \note  Unaugmented-style CRC runs perform modulo-2 polynomial division in
 | 
						|
      an altered order.  The trailing \a Bits number of zero-valued bits needed
 | 
						|
      to extracted an (unprocessed) checksum is virtually moved to near the
 | 
						|
      beginning of the message.  This is OK since the XOR operation is
 | 
						|
      commutative and associative.  It also means that you can get a checksum
 | 
						|
      anytime.  Since data is being read byte-wise, a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) can be used to speed computation.
 | 
						|
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
 | 
						|
           BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
 | 
						|
           bool ReflectIn, bool ReflectRem >
 | 
						|
inline
 | 
						|
typename uint_t<Bits>::fast
 | 
						|
crc
 | 
						|
(
 | 
						|
    void const *  buffer,
 | 
						|
    std::size_t   byte_count
 | 
						|
)
 | 
						|
{
 | 
						|
    BOOST_CRC_OPTIMAL_NAME  computer;
 | 
						|
    computer.process_bytes( buffer, byte_count );
 | 
						|
    return computer.checksum();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//  Augmented-message CRC computation function definition  -------------------//
 | 
						|
 | 
						|
/** Computes the polynomial remainder of a CRC run, assuming that \a buffer and
 | 
						|
    \a byte_count describe a memory block representing the polynomial dividend.
 | 
						|
    The first byte is considered the highest order, going down for subsequent
 | 
						|
    bytes.  Within a byte, the highest-order bit is read first (corresponding to
 | 
						|
    \e RefIn = \c False in the RMCA).  Check the other parts of this function's
 | 
						|
    documentation to see how a checksum can be gained and/or used.
 | 
						|
 | 
						|
    \pre  0 \< \a Bits \<= \c std\::numeric_limit\<uintmax_t\>\::digits
 | 
						|
 | 
						|
    \tparam Bits  The order of the modulo-2 polynomial divisor.  (\e Width from
 | 
						|
      the RMCA)
 | 
						|
    \tparam TruncPoly  The lowest coefficients of the divisor polynomial.  The
 | 
						|
      highest-order coefficient is omitted and always assumed to be 1.
 | 
						|
      (\e Poly from the RMCA)
 | 
						|
 | 
						|
    \param[in] buffer  The address where the memory block begins.
 | 
						|
    \param[in] byte_count  The number of bytes in the memory block.
 | 
						|
    \param[in] initial_remainder  The initial state of the polynomial
 | 
						|
      remainder, defaulting to zero if omitted.  If you are reading a memory
 | 
						|
      block in multiple runs, put the return value of the previous run here.
 | 
						|
      (Note that initial-remainders given by RMCA parameter lists, as
 | 
						|
      \e Init, assume that the initial remainder is in its \b unaugmented state,
 | 
						|
      so you would need to convert the value to make it suitable for this
 | 
						|
      function.  I currently don't provide a conversion routine.)
 | 
						|
 | 
						|
    \return  The interim remainder, if no augmentation is used.  A special value
 | 
						|
      if augmentation is used (see the notes).  No output processing is done on
 | 
						|
      the value.  (In RMCA terms, \e RefOut is \c False and \e XorOut is \c 0.)
 | 
						|
 | 
						|
    \note  Augmented-style CRC runs use straight-up modulo-2 polynomial
 | 
						|
      division.  Since data is being read byte-wise, a table of pre-computed
 | 
						|
      remainder changes (as XOR masks) can be used to speed computation.
 | 
						|
    \note  Reading just a memory block will yield an interim remainder, and not
 | 
						|
      the final checksum.  To get that checksum, allocate \a Bits / \c CHAR_BIT
 | 
						|
      bytes directly after the block and fill them with zero values, then extend
 | 
						|
      \a byte_count to include those extra bytes.  A data block is corrupt if
 | 
						|
      the return value doesn't equal your separately given checksum.
 | 
						|
    \note  Another way to perform a check is use the zero-byte extension method,
 | 
						|
      but replace the zero values with your separately-given checksum.  The
 | 
						|
      checksum must be loaded in big-endian order.  Here corruption, in either
 | 
						|
      the data block or the given checksum, is confirmed if the return value is
 | 
						|
      not zero.
 | 
						|
    \note  The two checksum techniques assume the CRC-run is performed bit-wise,
 | 
						|
      while this function works byte-wise.  That means that the techniques can
 | 
						|
      be used only if \c CHAR_BIT divides \a Bits evenly!
 | 
						|
 */
 | 
						|
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly >
 | 
						|
typename uint_t<Bits>::fast
 | 
						|
augmented_crc
 | 
						|
(
 | 
						|
    void const *                 buffer,
 | 
						|
    std::size_t                  byte_count,
 | 
						|
    typename uint_t<Bits>::fast  initial_remainder  // = 0u
 | 
						|
)
 | 
						|
{
 | 
						|
    return detail::low_bits_mask_c<Bits>::value &
 | 
						|
     detail::byte_table_driven_crcs<Bits, TruncPoly, false>::
 | 
						|
     augmented_crc_update( initial_remainder, static_cast<unsigned char const
 | 
						|
     *>(buffer), byte_count );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
}  // namespace boost
 | 
						|
 | 
						|
 | 
						|
// Undo header-private macros
 | 
						|
#undef BOOST_CRC_OPTIMAL_NAME
 | 
						|
#undef BOOST_CRC_PARM_TYPE
 | 
						|
 | 
						|
 | 
						|
#endif  // BOOST_CRC_HPP
 | 
						|
 |