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

/** Represents a line number range. */
public class Range {

  public final int from;
  public final int to;

  public Range(int from, int to) {
    this.from = from;
    this.to = to;
    // TODO(b/145897713): Seems like we should be able to assert from <= to.
  }

  public boolean contains(int value) {
    return from <= value && value <= to;
  }

  @Override
  public String toString() {
    return from + ":" + to;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof Range)) {
      return false;
    }

    Range range = (Range) o;
    return from == range.from && to == range.to;
  }

  @Override
  public int hashCode() {
    int result = from;
    result = 31 * result + to;
    return result;
  }
}
