001/*
002 * SonarQube
003 * Copyright (C) 2009-2017 SonarSource SA
004 * mailto:info AT sonarsource DOT com
005 *
006 * This program is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019 */
020package org.sonar.api.batch.fs.internal;
021
022import org.sonar.api.batch.fs.TextPointer;
023import org.sonar.api.batch.fs.TextRange;
024
025/**
026 * @since 5.2
027 */
028public class DefaultTextRange implements TextRange {
029
030  private final TextPointer start;
031  private final TextPointer end;
032
033  public DefaultTextRange(TextPointer start, TextPointer end) {
034    this.start = start;
035    this.end = end;
036  }
037
038  @Override
039  public TextPointer start() {
040    return start;
041  }
042
043  @Override
044  public TextPointer end() {
045    return end;
046  }
047
048  @Override
049  public boolean overlap(TextRange another) {
050    // [A,B] and [C,D]
051    // B > C && D > A
052    return this.end.compareTo(another.start()) > 0 && another.end().compareTo(this.start) > 0;
053  }
054
055  @Override
056  public String toString() {
057    return "Range[from " + start + " to " + end + "]";
058  }
059
060  @Override
061  public boolean equals(Object obj) {
062    if (!(obj instanceof DefaultTextRange)) {
063      return false;
064    }
065    DefaultTextRange other = (DefaultTextRange) obj;
066    return start.equals(other.start) && end.equals(other.end);
067  }
068
069  @Override
070  public int hashCode() {
071    return start.hashCode() * 17 + end.hashCode();
072  }
073
074}