// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.utils.structural;

import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;

/**
 * This is an interface that mimics the Hasher interface in Guava which allows us to use hashing in
 * the tests.
 */
public interface HasherWrapper {

  void putBoolean(boolean value);

  void putInt(int value);

  void putFloat(float value);

  void putLong(long value);

  void putDouble(double value);

  void putBytes(byte[] content);

  String hashCodeAsString();

  <T> T hash();

  static HasherWrapper sha256Hasher() {
    return new HasherWrapped(Hashing.sha256().newHasher());
  }

  static HasherWrapper murmur3128Hasher() {
    return new HasherWrapped(Hashing.murmur3_128().newHasher());
  }

  class HasherWrapped implements HasherWrapper {

    private final Hasher hasher;

    public HasherWrapped(Hasher hasher) {
      this.hasher = hasher;
    }

    @Override
    public void putBoolean(boolean value) {
      hasher.putBoolean(value);
    }

    @Override
    public void putInt(int value) {
      hasher.putInt(value);
    }

    @Override
    public void putFloat(float value) {
      hasher.putFloat(value);
    }

    @Override
    public void putLong(long value) {
      hasher.putLong(value);
    }

    @Override
    public void putDouble(double value) {
      hasher.putDouble(value);
    }

    @Override
    public void putBytes(byte[] content) {
      hasher.putBytes(content);
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T> T hash() {
      return (T) hasher.hash();
    }

    @Override
    public String hashCodeAsString() {
      return hasher.hash().toString();
    }
  }
}
