content: /*
   * Copyright (C) 2015 Actor LLC. <https://actor.im>
   */
  
  package im.actor.runtime.crypto;
  
  // Disabling Bounds checks for speeding up calculations
  
  /*-[
  #define J2OBJC_DISABLE_ARRAY_BOUND_CHECKS 1
  ]-*/
  
  /**
   * CRC32 Implementation
   */
  public class CRC32 {
      /**
       * The crc data checksum so far.
       */
      private int crc = 0;
  
      /**
       * The fast CRC table. Computed once when the CRC32 class is loaded.
       */
      private static int[] crc_table = make_crc_table();
  
      /**
       * Make the table for a fast CRC.
       */
      private static int[] make_crc_table() {
          int[] crc_table = new int[256];
          for (int n = 0; n < 256; n++) {
              int c = n;
              for (int k = 8; --k >= 0; ) {
                  if ((c & 1) != 0)
                      c = 0xedb88320 ^ (c >>> 1);
                  else
                      c = c >>> 1;
              }
              crc_table[n] = c;
          }
          return crc_table;
      }
  
      /**
       * Returns the CRC32 data checksum computed so far.
       */
      public long getValue() {
          return (long) crc & 0xffffffffL;
      }
  
      /**
       * Resets the CRC32 data checksum as if no update was ever called.
       */
      public void reset() {
          crc = 0;
      }
  
      /**
       * Updates the checksum with the int bval.
       *
       * @param bval (the byte is taken as the lower 8 bits of bval)
       */
  
      public void update(int bval) {
          int c = ~crc;
          c = crc_table[(c ^ bval) & 0xff] ^ (c >>> 8);
          crc = ~c;
      }
  
      /**
       * Adds the byte array to the data checksum.
       *
       * @param buf the buffer which contains the data
       * @param off the offset in the buffer where the data starts
       * @param len the length of the data
       */
      public void update(byte[] buf, int off, int len) {
          int c = ~crc;
          while (--len >= 0)
              c = crc_table[(c ^ buf[off++]) & 0xff] ^ (c >>> 8);
          crc = ~c;
      }
  
      /**
       * Adds the complete byte array to the data checksum.
       */
      public void update(byte[] buf) {
          update(buf, 0, buf.length);
      }
  }