1 /*
2 * Copyright 2012 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package org.jboss.netty.buffer;
17
18
19 /**
20 * Locates an index of data in a {@link ChannelBuffer}.
21 * <p>
22 * This interface enables the sequential search for the data which meets more
23 * complex and dynamic condition than just a simple value matching. Please
24 * refer to {@link ChannelBuffer#indexOf(int, int, ChannelBufferIndexFinder)} and
25 * {@link ChannelBuffer#bytesBefore(int, int, ChannelBufferIndexFinder)}
26 * for more explanation.
27 *
28 * @apiviz.uses org.jboss.netty.buffer.ChannelBuffer
29 */
30 public interface ChannelBufferIndexFinder {
31
32 /**
33 * Returns {@code true} if and only if the data is found at the specified
34 * {@code guessedIndex} of the specified {@code buffer}.
35 * <p>
36 * The implementation should not perform an operation which raises an
37 * exception such as {@link IndexOutOfBoundsException} nor perform
38 * an operation which modifies the content of the buffer.
39 */
40 boolean find(ChannelBuffer buffer, int guessedIndex);
41
42 /**
43 * Index finder which locates a {@code NUL (0x00)} byte.
44 */
45 ChannelBufferIndexFinder NUL = new ChannelBufferIndexFinder() {
46 public boolean find(ChannelBuffer buffer, int guessedIndex) {
47 return buffer.getByte(guessedIndex) == 0;
48 }
49 };
50
51 /**
52 * Index finder which locates a non-{@code NUL (0x00)} byte.
53 */
54 ChannelBufferIndexFinder NOT_NUL = new ChannelBufferIndexFinder() {
55 public boolean find(ChannelBuffer buffer, int guessedIndex) {
56 return buffer.getByte(guessedIndex) != 0;
57 }
58 };
59
60 /**
61 * Index finder which locates a {@code CR ('\r')} byte.
62 */
63 ChannelBufferIndexFinder CR = new ChannelBufferIndexFinder() {
64 public boolean find(ChannelBuffer buffer, int guessedIndex) {
65 return buffer.getByte(guessedIndex) == '\r';
66 }
67 };
68
69 /**
70 * Index finder which locates a non-{@code CR ('\r')} byte.
71 */
72 ChannelBufferIndexFinder NOT_CR = new ChannelBufferIndexFinder() {
73 public boolean find(ChannelBuffer buffer, int guessedIndex) {
74 return buffer.getByte(guessedIndex) != '\r';
75 }
76 };
77
78 /**
79 * Index finder which locates a {@code LF ('\n')} byte.
80 */
81 ChannelBufferIndexFinder LF = new ChannelBufferIndexFinder() {
82 public boolean find(ChannelBuffer buffer, int guessedIndex) {
83 return buffer.getByte(guessedIndex) == '\n';
84 }
85 };
86
87 /**
88 * Index finder which locates a non-{@code LF ('\n')} byte.
89 */
90 ChannelBufferIndexFinder NOT_LF = new ChannelBufferIndexFinder() {
91 public boolean find(ChannelBuffer buffer, int guessedIndex) {
92 return buffer.getByte(guessedIndex) != '\n';
93 }
94 };
95
96 /**
97 * Index finder which locates a {@code CR ('\r')} or {@code LF ('\n')}.
98 */
99 ChannelBufferIndexFinder CRLF = new ChannelBufferIndexFinder() {
100 public boolean find(ChannelBuffer buffer, int guessedIndex) {
101 byte b = buffer.getByte(guessedIndex);
102 return b == '\r' || b == '\n';
103 }
104 };
105
106 /**
107 * Index finder which locates a byte which is neither a {@code CR ('\r')}
108 * nor a {@code LF ('\n')}.
109 */
110 ChannelBufferIndexFinder NOT_CRLF = new ChannelBufferIndexFinder() {
111 public boolean find(ChannelBuffer buffer, int guessedIndex) {
112 byte b = buffer.getByte(guessedIndex);
113 return b != '\r' && b != '\n';
114 }
115 };
116
117 /**
118 * Index finder which locates a linear whitespace
119 * ({@code ' '} and {@code '\t'}).
120 */
121 ChannelBufferIndexFinder LINEAR_WHITESPACE = new ChannelBufferIndexFinder() {
122 public boolean find(ChannelBuffer buffer, int guessedIndex) {
123 byte b = buffer.getByte(guessedIndex);
124 return b == ' ' || b == '\t';
125 }
126 };
127
128 /**
129 * Index finder which locates a byte which is not a linear whitespace
130 * (neither {@code ' '} nor {@code '\t'}).
131 */
132 ChannelBufferIndexFinder NOT_LINEAR_WHITESPACE = new ChannelBufferIndexFinder() {
133 public boolean find(ChannelBuffer buffer, int guessedIndex) {
134 byte b = buffer.getByte(guessedIndex);
135 return b != ' ' && b != '\t';
136 }
137 };
138 }