// Copyright (c) 2016, 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.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
import java.util.Collection;
import java.util.function.Consumer;

public abstract class DexItem {

  static <T extends DexItem> void collectAll(IndexedItemCollection indexedItems, T[] items) {
    consumeArray(items, (T item) -> item.collectIndexedItems(indexedItems));
  }

  public static <T extends DexItem> void collectAll(MixedSectionCollection mixedItems, T[] items) {
    consumeArray(items, (T item) -> item.collectMixedSectionItems(mixedItems));
  }

  public static <T extends DexItem> void collectAll(MixedSectionCollection mixedItems,
      Collection<T> items) {
    items.forEach((T item) -> item.collectMixedSectionItems(mixedItems));
  }

  /**
   * Helper method to iterate over elements in an array.
   * Handles the case where the array is null.
   */
  private static <T extends DexItem> void consumeArray(T[] items, Consumer<T> consumer) {
    if (items == null) {
      return;
    }
    for (T item : items) {
      if (item != null) {
        consumer.accept(item);
      }
    }
  }

  abstract void collectIndexedItems(IndexedItemCollection collection,
      DexMethod method, int instructionOffset);

  public void collectIndexedItems(IndexedItemCollection collection) {
    collectIndexedItems(collection, null, -1);
  }

  public void collectIndexedItems(IndexedItemCollection collection, DexMethod method) {
    collectIndexedItems(collection, method, -1);
  }

  abstract void collectMixedSectionItems(MixedSectionCollection collection);

  protected void flushCachedValues() {
    // Overwritten in subclasses.
  }

  public String toSmaliString() {
    return toString();
  }

  public String toSourceString() {
    return toString();
  }
}
