// 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 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 + "]";
  }
}
