You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Region.java 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. @Override
  109. public String toString() {
  110. StringBuilder buf = new StringBuilder();
  111. Region r = this;
  112. do {
  113. if (r != this)
  114. buf.append(',');
  115. buf.append(r.resultStart);
  116. buf.append('-');
  117. buf.append(r.resultStart + r.length);
  118. r = r.next;
  119. } while (r != null);
  120. return buf.toString();
  121. }
  122. }