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

/**
 * Closed interval of two longs.
 */
public class LongInterval {

  private final long min;
  private final long max;

  public LongInterval(int min, int max) {
    assert min <= max;
    this.min = min;
    this.max = max;
  }

  public LongInterval(long min, long max) {
    assert min <= max;
    this.min = min;
    this.max = max;
  }

  public long getMin() {
    return min;
  }

  public long getMax() {
    return max;
  }

  public boolean isSingleValue() {
    return min == max;
  }

  public boolean isSingleValue(int value) {
    return isSingleValue() && getSingleValue() == value;
  }

  public long getSingleValue() {
    assert isSingleValue();
    return min;
  }

  public boolean containsValue(long value) {
    return min <= value && value <= max;
  }

  public boolean doesntOverlapWith(LongInterval other) {
    return other.max < min || max < other.min;
  }

  public boolean overlapsWith(LongInterval other) {
    return other.max >= min && max >= other.min;
  }

  @Override
  public int hashCode() {
    return super.hashCode();
  }

  @Override
  public boolean equals(Object other) {
    if (this == other) {
      return true;
    }
    if (other instanceof LongInterval) {
      return ((LongInterval) other).min == min && ((LongInterval) other).max == max;
    }
    return false;
  }

  @Override
  public String toString() {
    return "[" + min + ", " + max + "]";
  }
}
