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

public abstract class PositionRangeAllocator {

  private static final int MAX_POSITION = 256;
  private static final int MAX_DELTA = 1;

  final Range[] cache = new Range[MAX_POSITION];

  public Range get(int index) {
    return (index >= 0 && index < MAX_POSITION) ? cache[index] : new Range(index);
  }

  public static CardinalPositionRangeAllocator createCardinalPositionRangeAllocator() {
    return new CardinalPositionRangeAllocator();
  }

  public static NonCardinalPositionRangeAllocator createNonCardinalPositionRangeAllocator() {
    return new NonCardinalPositionRangeAllocator();
  }

  public static class CardinalPositionRangeAllocator extends PositionRangeAllocator {

    private CardinalPositionRangeAllocator() {
      super();
      for (int i = 0; i < MAX_POSITION; i++) {
        cache[i] = new Range(i);
      }
    }
  }

  public static class NonCardinalPositionRangeFixedDeltaCache extends PositionRangeAllocator {

    public NonCardinalPositionRangeFixedDeltaCache(int delta) {
      super();
      for (int i = 0; i < MAX_POSITION; i++) {
        cache[i] = new Range(i, i + delta);
      }
    }
  }

  public static class NonCardinalPositionRangeAllocator extends PositionRangeAllocator {

    private final NonCardinalPositionRangeFixedDeltaCache[] cache =
        new NonCardinalPositionRangeFixedDeltaCache[MAX_DELTA + 1];

    private NonCardinalPositionRangeAllocator() {
      for (int i = 0; i <= MAX_DELTA; i++) {
        cache[i] = new NonCardinalPositionRangeFixedDeltaCache(i);
      }
    }

    public Range get(int from, int to) {
      if (from >= MAX_POSITION) {
        return new Range(from, to);
      }
      int thisDelta = to - from;
      if (thisDelta < 0) {
        return new Range(from, to);
      }
      if (thisDelta > MAX_DELTA) {
        return new Range(from, to);
      }
      return cache[thisDelta].get(from);
    }
  }
}
