Skip to content

Commit 71fce49

Browse files
committed
CharBuffer API: indexOfAny and lastIndexOfAny
1 parent 7273773 commit 71fce49

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

src/main/java/io/routekit/util/CharBuffer.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,25 @@ public int indexOf(char ch, int from, int def) {
192192
return def;
193193
}
194194

195+
public int indexOfAny(char ch1, char ch2) {
196+
return indexOfAny(ch1, ch2, 0, -1);
197+
}
198+
199+
public int indexOfAny(char ch1, char ch2, int from) {
200+
return indexOfAny(ch1, ch2, from, -1);
201+
}
202+
203+
public int indexOfAny(char ch1, char ch2, int from, int def) {
204+
assert from >= 0 : "From index can't be negative: %d".formatted(from);
205+
assert def < 0 || def >= length() : "Default index can't be within buffer bounds: %d".formatted(def);
206+
for (int i = start + from; i < end; ++i) {
207+
if (chars[i] == ch1 || chars[i] == ch2) {
208+
return i - start;
209+
}
210+
}
211+
return def;
212+
}
213+
195214
public int lastIndexOf(char ch) {
196215
return lastIndexOf(ch, end - 1, -1);
197216
}
@@ -211,6 +230,25 @@ public int lastIndexOf(char ch, int from, int def) {
211230
return def;
212231
}
213232

233+
public int lastIndexOfAny(char ch1, char ch2) {
234+
return lastIndexOfAny(ch1, ch2, end - 1, -1);
235+
}
236+
237+
public int lastIndexOfAny(char ch1, char ch2, int from) {
238+
return lastIndexOfAny(ch1, ch2, from, -1);
239+
}
240+
241+
public int lastIndexOfAny(char ch1, char ch2, int from, int def) {
242+
assert from >= 0 : "From index can't be negative: %d".formatted(from);
243+
assert def < 0 || def >= length() : "Default index can't be within buffer bounds: %d".formatted(def);
244+
for (int i = from; i >= start; --i) {
245+
if (chars[i] == ch1 || chars[i] == ch2) {
246+
return i - start;
247+
}
248+
}
249+
return def;
250+
}
251+
214252
// Returns the length of the common prefix
215253
public int commonPrefix(CharBuffer buf) {
216254
int index = Arrays.mismatch(chars, start, end, buf.chars, buf.start, buf.end);

src/test/java/io/routekit/util/CharBufferTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,34 @@ public void indexOf() {
9191
Assertions.assertEquals(11, buffer.indexOf('-', 8, buffer.length()));
9292
}
9393

94+
@Test
95+
public void indexOfAny() {
96+
CharBuffer buffer = new CharBuffer("foo-bar-baz");
97+
98+
Assertions.assertEquals(0, buffer.indexOfAny('f', 'o'));
99+
Assertions.assertEquals(1, buffer.indexOfAny('o', 'o'));
100+
Assertions.assertEquals(3, buffer.indexOfAny('a', '-'));
101+
Assertions.assertEquals(5, buffer.indexOfAny('a', 'z'));
102+
Assertions.assertEquals(10, buffer.indexOfAny('z', 'w'));
103+
Assertions.assertEquals(-1, buffer.indexOfAny('x', 'y'));
104+
105+
Assertions.assertEquals(-1, buffer.indexOfAny('f', 'g', 1));
106+
Assertions.assertEquals(-2, buffer.indexOfAny('f', 'g', 1, -2));
107+
Assertions.assertEquals(11, buffer.indexOfAny('f', 'g', 1, buffer.length()));
108+
Assertions.assertEquals(1, buffer.indexOfAny('o', 'a', 1));
109+
Assertions.assertEquals(1, buffer.indexOfAny('o', 'a', 1, -2));
110+
Assertions.assertEquals(3, buffer.indexOfAny('-', 'a', 3));
111+
Assertions.assertEquals(3, buffer.indexOfAny('-', 'a', 3, buffer.length()));
112+
Assertions.assertEquals(7, buffer.indexOfAny('z', '-', 4));
113+
Assertions.assertEquals(7, buffer.indexOfAny('z', '-', 4, buffer.length()));
114+
Assertions.assertEquals(7, buffer.indexOfAny('z', '-', 4, -2));
115+
Assertions.assertEquals(7, buffer.indexOfAny('z', '-', 7, buffer.length()));
116+
Assertions.assertEquals(9, buffer.indexOfAny('a', '-', 8, buffer.length()));
117+
Assertions.assertEquals(10, buffer.indexOfAny('z', '-', 8, buffer.length()));
118+
Assertions.assertEquals(11, buffer.indexOfAny('z', '-', 11, buffer.length()));
119+
Assertions.assertEquals(11, buffer.indexOfAny('o', '-', 8, buffer.length()));
120+
}
121+
94122
@Test
95123
public void lastIndexOf() {
96124
CharBuffer buffer = new CharBuffer("foo-bar-baz");
@@ -112,6 +140,32 @@ public void lastIndexOf() {
112140
Assertions.assertEquals(-2, buffer.lastIndexOf('a', 4, -2));
113141
}
114142

143+
@Test
144+
public void lastIndexOfAny() {
145+
CharBuffer buffer = new CharBuffer("foo-bar-baz");
146+
147+
Assertions.assertEquals(0, buffer.lastIndexOfAny('f', 'g'));
148+
Assertions.assertEquals(2, buffer.lastIndexOfAny('f', 'o'));
149+
Assertions.assertEquals(2, buffer.lastIndexOfAny('o', 'f'));
150+
Assertions.assertEquals(2, buffer.lastIndexOfAny('o', 'x'));
151+
Assertions.assertEquals(7, buffer.lastIndexOfAny('-', 'o'));
152+
Assertions.assertEquals(9, buffer.lastIndexOfAny('-', 'a'));
153+
Assertions.assertEquals(10, buffer.lastIndexOfAny('-', 'z'));
154+
Assertions.assertEquals(-1, buffer.lastIndexOfAny('x', 'y'));
155+
156+
Assertions.assertEquals(0, buffer.lastIndexOfAny('f', 'g', 10));
157+
Assertions.assertEquals(0, buffer.lastIndexOfAny('f', 'g', 10, -1));
158+
Assertions.assertEquals(10, buffer.lastIndexOfAny('f', 'z', 10));
159+
Assertions.assertEquals(10, buffer.lastIndexOfAny('f', 'z', 10, -1));
160+
Assertions.assertEquals(10, buffer.lastIndexOfAny('a', 'z', 10));
161+
Assertions.assertEquals(9, buffer.lastIndexOfAny('a', 'r', 10));
162+
Assertions.assertEquals(9, buffer.lastIndexOfAny('a', 'z', 9));
163+
Assertions.assertEquals(5, buffer.lastIndexOfAny('a', 'z', 8));
164+
Assertions.assertEquals(5, buffer.lastIndexOfAny('a', 'r', 5));
165+
Assertions.assertEquals(-1, buffer.lastIndexOfAny('a', 'r', 4));
166+
Assertions.assertEquals(-2, buffer.lastIndexOfAny('a', 'r', 4, -2));
167+
}
168+
115169
@Test
116170
public void commonPrefix() {
117171
Assertions.assertEquals(0, new CharBuffer("foo").commonPrefix(new CharBuffer("bar")));

0 commit comments

Comments
 (0)