/*
* File:        crc.h
*
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
* See included license file for license details.
*/
#if !defined(_crc_h_)
#define CRYPTOPP_CRC32_H

#include "stdafx.h"

const uint32_t CRC32_NEGL = 0xffffffffL;

#ifdef __LITTLE_ENDIAN__
       #define CRC32_INDEX(c) (c & 0xff)
       #define CRC32_SHIFTED(c) (c >> 8)
#else
       #define CRC32_INDEX(c) (c >> 24)
       #define CRC32_SHIFTED(c) (c << 8)
#endif

//! CRC Checksum Calculation
class CRC32
{
public:
       enum
       {
               DIGESTSIZE = 4
       };

       CRC32();

       void update(const uint8_t * input, unsigned length);

       void truncatedFinal(uint8_t * hash, unsigned size);

       void updateByte(uint8_t b) { m_crc = m_tab[CRC32_INDEX(m_crc) ^ b] ^ CRC32_SHIFTED(m_crc); }
       uint8_t getCrcByte(unsigned i) const { return ((uint8_t *)&(m_crc))[i]; }

private:
       void reset() { m_crc = CRC32_NEGL; m_count = 0; }

       static const uint32_t m_tab[256];
       uint32_t m_crc;
   unsigned m_count;
};

#endif // _crc_h_