// Copyright (c) 2023, 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.graph;

import com.android.tools.r8.utils.TraversalContinuation;
import java.util.Collection;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;

public abstract class FieldCollectionBacking {

  // Internal consistency.

  static boolean belongsInStaticPool(DexEncodedField field) {
    return field.isStatic();
  }

  static boolean belongsInInstancePool(DexEncodedField field) {
    return !belongsInStaticPool(field);
  }

  abstract boolean verify();

  // Traversal methods.

  abstract <BT, CT> TraversalContinuation<BT, CT> traverse(
      DexClass holder, Function<? super DexClassAndField, TraversalContinuation<BT, CT>> fn);

  abstract <BT, CT> TraversalContinuation<BT, CT> traverse(
      DexClass holder,
      BiFunction<? super DexClassAndField, ? super CT, TraversalContinuation<BT, CT>> fn,
      CT initialValue);

  abstract <BT, CT> TraversalContinuation<BT, CT> traverseInstanceFields(
      DexClass holder, Function<? super DexClassAndField, TraversalContinuation<BT, CT>> fn);

  abstract <BT, CT> TraversalContinuation<BT, CT> traverseInstanceFields(
      DexClass holder,
      BiFunction<? super DexClassAndField, ? super CT, TraversalContinuation<BT, CT>> fn,
      CT initialValue);

  abstract <BT, CT> TraversalContinuation<BT, CT> traverseStaticFields(
      DexClass holder, Function<? super DexClassAndField, TraversalContinuation<BT, CT>> fn);

  abstract <BT, CT> TraversalContinuation<BT, CT> traverseStaticFields(
      DexClass holder,
      BiFunction<? super DexClassAndField, ? super CT, TraversalContinuation<BT, CT>> fn,
      CT initialValue);

  // Collection methods.

  abstract int size();

  abstract Iterable<DexEncodedField> fields(Predicate<? super DexEncodedField> predicate);

  // Specialized to static fields.

  abstract int numberOfStaticFields();

  abstract List<DexEncodedField> staticFieldsAsList();

  abstract void appendStaticField(DexEncodedField field);

  abstract void appendStaticFields(Collection<DexEncodedField> fields);

  abstract void clearStaticFields();

  abstract void setStaticFields(DexEncodedField[] fields);

  // Specialized to instance fields.

  abstract int numberOfInstanceFields();

  abstract List<DexEncodedField> instanceFieldsAsList();

  abstract void appendInstanceField(DexEncodedField field);

  abstract void appendInstanceFields(Collection<DexEncodedField> fields);

  abstract void clearInstanceFields();

  abstract void setInstanceFields(DexEncodedField[] fields);

  abstract DexEncodedField lookupField(DexField field);

  abstract DexEncodedField lookupStaticField(DexField field);

  abstract DexEncodedField lookupInstanceField(DexField field);

  abstract void replaceFields(Function<DexEncodedField, DexEncodedField> replacement);
}
