/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Copyright 2011 Danny Robson */ #include "./crc.hpp" #include "../debug.hpp" #include using util::hash::crc; /////////////////////////////////////////////////////////////////////////////// template const std::array crc::s_table = crc::table (); /////////////////////////////////////////////////////////////////////////////// template crc::crc () noexcept { reset (); } //----------------------------------------------------------------------------- template void crc::reset (void) noexcept { m_digest = 0; m_digest = ~m_digest; } /////////////////////////////////////////////////////////////////////////////// template void crc::update (const uint8_t *restrict first, const uint8_t *restrict last) noexcept { CHECK_LE (first, last); for (auto cursor = first; cursor != last; ++cursor) { m_digest = s_table[*cursor ^ (m_digest & 0xFF)] ^ (m_digest >> 8u); } } //----------------------------------------------------------------------------- template void crc::update (const void *restrict _data, size_t len) noexcept { auto data = reinterpret_cast (_data); return update(data, data + len); } //----------------------------------------------------------------------------- template void crc::finish (void) { ; } //----------------------------------------------------------------------------- template DigestT crc::digest (void) const { return ~m_digest; } /////////////////////////////////////////////////////////////////////////////// template std::array util::hash::crc::table (void) { auto gen = Generator; std::array value {}; for (int i = 0; i < 256; ++i) { digest_t c = i; for (int k = 0; k < 8; ++k) { if (c & 1) c = gen ^ (c >> 1); else c >>= 1; } value[i] = c; } return value; }; /////////////////////////////////////////////////////////////////////////////// template class util::hash::crc; // png //template class util::hash::crc; // ogg