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

/**
 * Subset of dex items that are referenced by some table index.
 */
public abstract class IndexedDexItem extends CachedHashValueDexItem implements Presorted {

  private static final int SORTED_INDEX_UNKNOWN = -1;
  private int sortedIndex = SORTED_INDEX_UNKNOWN; // assigned globally after reading.

  @Override
  public abstract void collectIndexedItems(IndexedItemCollection indexedItems,
      DexMethod method, int instructionOffset);

  @Override
  void collectMixedSectionItems(MixedSectionCollection mixedItems) {
    // Should never be visited.
    assert false;
  }

  public abstract int getOffset(ObjectToOffsetMapping mapping);

  // Partial implementation of PresortedComparable.

  @Override
  final public void setSortedIndex(int sortedIndex) {
    assert sortedIndex > SORTED_INDEX_UNKNOWN;
    assert this.sortedIndex == SORTED_INDEX_UNKNOWN;
    this.sortedIndex = sortedIndex;
  }

  @Override
  final public int getSortedIndex() {
    return sortedIndex;
  }

  @Override
  final public int sortedCompareTo(int other) {
    assert sortedIndex > SORTED_INDEX_UNKNOWN;
    assert other > SORTED_INDEX_UNKNOWN;
    return Integer.compare(sortedIndex, other);
  }

  @Override
  public void flushCachedValues() {
    super.flushCachedValues();
    resetSortedIndex();
  }

  public void resetSortedIndex() {
    sortedIndex = SORTED_INDEX_UNKNOWN;
  }
}
