// 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.ir.conversion;

import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import java.util.function.BiConsumer;

public class MethodProcessingId {

  private final int primaryId;
  private int secondaryId = 1;

  private MethodProcessingId(int primaryId) {
    this.primaryId = primaryId;
  }

  public String getAndIncrementId() {
    String id = getId();
    secondaryId++;
    return id;
  }

  public String getId() {
    if (secondaryId == 1) {
      return Integer.toString(primaryId);
    }
    return primaryId + "$" + secondaryId;
  }

  public int getPrimaryId() {
    return primaryId;
  }

  public static class Factory {

    private final BiConsumer<ProgramMethod, MethodProcessingId> consumer;
    private int nextId = 1;

    public Factory() {
      this(null);
    }

    public Factory(BiConsumer<ProgramMethod, MethodProcessingId> consumer) {
      this.consumer = consumer;
    }

    public ReservedMethodProcessingIds reserveIds(SortedProgramMethodSet wave) {
      ReservedMethodProcessingIds result = new ReservedMethodProcessingIds(nextId, wave.size());
      nextId += wave.size();
      return result;
    }

    public class ReservedMethodProcessingIds {

      private final int firstReservedId;
      private final int numberOfReservedIds;

      private final ProgramMethodSet seen =
          InternalOptions.assertionsEnabled() ? ProgramMethodSet.createConcurrent() : null;

      public ReservedMethodProcessingIds(int firstReservedId, int numberOfReservedIds) {
        this.firstReservedId = firstReservedId;
        this.numberOfReservedIds = numberOfReservedIds;
      }

      public MethodProcessingId get(ProgramMethod method, int index) {
        assert index >= 0;
        assert index < numberOfReservedIds;
        assert seen.add(method);
        MethodProcessingId result = new MethodProcessingId(firstReservedId + index);
        if (consumer != null) {
          consumer.accept(method, result);
        }
        return result;
      }
    }
  }
}
