// Copyright (c) 2020, 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.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.structural.StructuralItem.HashingAccept;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

public abstract class HashingVisitor {

  public abstract void visitBool(boolean value);

  public abstract void visitInt(int value);

  public abstract void visitFloat(float value);

  public abstract void visitLong(long value);

  public abstract void visitDouble(double value);

  /** Base for visiting an enumeration of items. */
  protected abstract <S> void visitItemIterator(Iterator<S> it, HashingAccept<S> hashingAccept);

  public final <S extends StructuralItem<S>> void visitItemArray(S[] items) {
    visitItemCollection(Arrays.asList(items));
  }

  public final <S extends StructuralItem<S>> void visitItemCollection(Collection<S> items) {
    visitItemIterator(items.iterator(), S::acceptHashing);
  }

  public abstract void visitDexString(DexString string);

  public abstract void visitDexType(DexType type);

  public void visitDexField(DexField field) {
    visit(field, field.getStructuralMapping());
  }

  public void visitDexMethod(DexMethod method) {
    visit(method, method.getStructuralMapping());
  }

  public void visitDexReference(DexReference reference) {
    reference.accept(this::visitDexType, this::visitDexField, this::visitDexMethod);
  }

  public abstract <S> void visit(S item, StructuralMapping<S> accept);
}
