// 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.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 TraversalContinuation<?, ?> traverse(
      Function<DexEncodedField, TraversalContinuation<?, ?>> fn);

  // 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);
}
