1
2
3
4
5 package com.qulice.checkstyle;
6
7 import com.google.common.base.Predicate;
8 import com.google.common.collect.FluentIterable;
9 import java.util.ArrayList;
10 import java.util.Collection;
11 import java.util.Iterator;
12
13
14
15
16
17
18
19
20 public final class LineRanges {
21
22
23
24
25 private final LineRanges.LocalCollection lines =
26 new LineRanges.LocalCollection();
27
28
29
30
31
32 public void add(final LineRange line) {
33 this.lines.collection().add(line);
34 }
35
36
37
38
39
40 public Iterator<LineRange> iterator() {
41 return this.lines.collection().iterator();
42 }
43
44
45
46
47
48
49 public boolean inRange(final int line) {
50 return !this.lines.collection().isEmpty()
51 && FluentIterable.from(this.lines.collection())
52 .anyMatch(new LineRanges.LineWithAny(line));
53 }
54
55
56
57
58
59
60
61 public LineRanges within(final LineRanges ranges) {
62 final LineRanges result = new LineRanges();
63 final Iterator<LineRange> iterator = ranges.iterator();
64 while (iterator.hasNext()) {
65 final LineRange next = iterator.next();
66 for (final LineRange line : this.lines.collection()) {
67 if (next.within(line)) {
68 result.add(line);
69 }
70 }
71 }
72 return result;
73 }
74
75
76
77
78 public void clear() {
79 this.lines.collection().clear();
80 }
81
82
83
84
85
86
87
88 private static final class LineWithAny implements Predicate<LineRange> {
89
90
91
92
93 private final int given;
94
95
96
97
98
99 private LineWithAny(final int line) {
100 this.given = line;
101 }
102
103 @Override
104 public boolean apply(final LineRange range) {
105 return range != null && range.within(this.given);
106 }
107 }
108
109
110
111
112
113
114 private static final class LocalCollection
115 extends ThreadLocal<Collection<LineRange>> {
116
117
118
119
120 private final transient Collection<LineRange> ranges =
121 new ArrayList<>(20);
122
123
124
125
126
127 public Collection<LineRange> collection() {
128 return this.ranges;
129 }
130 }
131 }