Region.java

  1. /*
  2.  * Copyright (C) 2011, Google Inc.
  3.  * and other copyright owners as documented in the project's IP log.
  4.  *
  5.  * This program and the accompanying materials are made available
  6.  * under the terms of the Eclipse Distribution License v1.0 which
  7.  * accompanies this distribution, is reproduced below, and is
  8.  * available at http://www.eclipse.org/org/documents/edl-v10.php
  9.  *
  10.  * All rights reserved.
  11.  *
  12.  * Redistribution and use in source and binary forms, with or
  13.  * without modification, are permitted provided that the following
  14.  * conditions are met:
  15.  *
  16.  * - Redistributions of source code must retain the above copyright
  17.  *   notice, this list of conditions and the following disclaimer.
  18.  *
  19.  * - Redistributions in binary form must reproduce the above
  20.  *   copyright notice, this list of conditions and the following
  21.  *   disclaimer in the documentation and/or other materials provided
  22.  *   with the distribution.
  23.  *
  24.  * - Neither the name of the Eclipse Foundation, Inc. nor the
  25.  *   names of its contributors may be used to endorse or promote
  26.  *   products derived from this software without specific prior
  27.  *   written permission.
  28.  *
  29.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  30.  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  31.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  34.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  35.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  36.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  37.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  38.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  40.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  41.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42.  */

  43. package org.eclipse.jgit.blame;

  44. /**
  45.  * Region of the result that still needs to be computed.
  46.  * <p>
  47.  * Regions are held in a singly-linked-list by {@link Candidate} using the
  48.  * {@link Candidate#regionList} field. The list is kept in sorted order by
  49.  * {@link #resultStart}.
  50.  */
  51. class Region {
  52.     /** Next entry in the region linked list. */
  53.     Region next;

  54.     /** First position of this region in the result file blame is computing. */
  55.     int resultStart;

  56.     /** First position in the {@link Candidate} that owns this Region. */
  57.     int sourceStart;

  58.     /** Length of the region, always >= 1. */
  59.     int length;

  60.     Region(int rs, int ss, int len) {
  61.         resultStart = rs;
  62.         sourceStart = ss;
  63.         length = len;
  64.     }

  65.     /**
  66.      * Copy the entire result region, but at a new source position.
  67.      *
  68.      * @param newSource
  69.      *            the new source position.
  70.      * @return the same result region, but offset for a new source.
  71.      */
  72.     Region copy(int newSource) {
  73.         return new Region(resultStart, newSource, length);
  74.     }

  75.     /**
  76.      * Split the region, assigning a new source position to the first half.
  77.      *
  78.      * @param newSource
  79.      *            the new source position.
  80.      * @param newLen
  81.      *            length of the new region.
  82.      * @return the first half of the region, at the new source.
  83.      */
  84.     Region splitFirst(int newSource, int newLen) {
  85.         return new Region(resultStart, newSource, newLen);
  86.     }

  87.     /**
  88.      * Edit this region to remove the first {@code d} elements.
  89.      *
  90.      * @param d
  91.      *            number of elements to remove from the start of this region.
  92.      */
  93.     void slideAndShrink(int d) {
  94.         resultStart += d;
  95.         sourceStart += d;
  96.         length -= d;
  97.     }

  98.     Region deepCopy() {
  99.         Region head = new Region(resultStart, sourceStart, length);
  100.         Region tail = head;
  101.         for (Region n = next; n != null; n = n.next) {
  102.             Region q = new Region(n.resultStart, n.sourceStart, n.length);
  103.             tail.next = q;
  104.             tail = q;
  105.         }
  106.         return head;
  107.     }

  108.     /** {@inheritDoc} */
  109.     @Override
  110.     public String toString() {
  111.         StringBuilder buf = new StringBuilder();
  112.         Region r = this;
  113.         do {
  114.             if (r != this)
  115.                 buf.append(',');
  116.             buf.append(r.resultStart);
  117.             buf.append('-');
  118.             buf.append(r.resultStart + r.length);
  119.             r = r.next;
  120.         } while (r != null);
  121.         return buf.toString();
  122.     }
  123. }