1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package io.netty.buffer;
16
17 import io.netty.util.Recycler;
18 import io.netty.util.internal.ObjectPool.Handle;
19 import io.netty.util.internal.PlatformDependent;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.nio.ByteBuffer;
25
26 class PooledHeapByteBuf extends PooledByteBuf<byte[]> {
27
28 private static final Recycler<PooledHeapByteBuf> RECYCLER =
29 new Recycler<PooledHeapByteBuf>() {
30 @Override
31 protected PooledHeapByteBuf newObject(Handle<PooledHeapByteBuf> handle) {
32 return new PooledHeapByteBuf(handle, 0);
33 }
34 };
35
36 static PooledHeapByteBuf newInstance(int maxCapacity) {
37 PooledHeapByteBuf buf = RECYCLER.get();
38 buf.reuse(maxCapacity);
39 return buf;
40 }
41
42 PooledHeapByteBuf(Handle<? extends PooledHeapByteBuf> recyclerHandle, int maxCapacity) {
43 super(recyclerHandle, maxCapacity);
44 }
45
46 @Override
47 public final boolean isDirect() {
48 return false;
49 }
50
51 @Override
52 protected byte _getByte(int index) {
53 return HeapByteBufUtil.getByte(memory, idx(index));
54 }
55
56 @Override
57 protected short _getShort(int index) {
58 return HeapByteBufUtil.getShort(memory, idx(index));
59 }
60
61 @Override
62 protected short _getShortLE(int index) {
63 return HeapByteBufUtil.getShortLE(memory, idx(index));
64 }
65
66 @Override
67 protected int _getUnsignedMedium(int index) {
68 return HeapByteBufUtil.getUnsignedMedium(memory, idx(index));
69 }
70
71 @Override
72 protected int _getUnsignedMediumLE(int index) {
73 return HeapByteBufUtil.getUnsignedMediumLE(memory, idx(index));
74 }
75
76 @Override
77 protected int _getInt(int index) {
78 return HeapByteBufUtil.getInt(memory, idx(index));
79 }
80
81 @Override
82 protected int _getIntLE(int index) {
83 return HeapByteBufUtil.getIntLE(memory, idx(index));
84 }
85
86 @Override
87 protected long _getLong(int index) {
88 return HeapByteBufUtil.getLong(memory, idx(index));
89 }
90
91 @Override
92 protected long _getLongLE(int index) {
93 return HeapByteBufUtil.getLongLE(memory, idx(index));
94 }
95
96 @Override
97 public final ByteBuf getBytes(int index, ByteBuf dst, int dstIndex, int length) {
98 checkDstIndex(index, length, dstIndex, dst.capacity());
99 if (dst.hasMemoryAddress() && PlatformDependent.hasUnsafe()) {
100 PlatformDependent.copyMemory(memory, idx(index), dst.memoryAddress() + dstIndex, length);
101 } else if (dst.hasArray()) {
102 getBytes(index, dst.array(), dst.arrayOffset() + dstIndex, length);
103 } else {
104 dst.setBytes(dstIndex, memory, idx(index), length);
105 }
106 return this;
107 }
108
109 @Override
110 public final ByteBuf getBytes(int index, byte[] dst, int dstIndex, int length) {
111 checkDstIndex(index, length, dstIndex, dst.length);
112 System.arraycopy(memory, idx(index), dst, dstIndex, length);
113 return this;
114 }
115
116 @Override
117 public final ByteBuf getBytes(int index, ByteBuffer dst) {
118 int length = dst.remaining();
119 checkIndex(index, length);
120 dst.put(memory, idx(index), length);
121 return this;
122 }
123
124 @Override
125 public final ByteBuf getBytes(int index, OutputStream out, int length) throws IOException {
126 checkIndex(index, length);
127 out.write(memory, idx(index), length);
128 return this;
129 }
130
131 @Override
132 protected void _setByte(int index, int value) {
133 HeapByteBufUtil.setByte(memory, idx(index), value);
134 }
135
136 @Override
137 protected void _setShort(int index, int value) {
138 HeapByteBufUtil.setShort(memory, idx(index), value);
139 }
140
141 @Override
142 protected void _setShortLE(int index, int value) {
143 HeapByteBufUtil.setShortLE(memory, idx(index), value);
144 }
145
146 @Override
147 protected void _setMedium(int index, int value) {
148 HeapByteBufUtil.setMedium(memory, idx(index), value);
149 }
150
151 @Override
152 protected void _setMediumLE(int index, int value) {
153 HeapByteBufUtil.setMediumLE(memory, idx(index), value);
154 }
155
156 @Override
157 protected void _setInt(int index, int value) {
158 HeapByteBufUtil.setInt(memory, idx(index), value);
159 }
160
161 @Override
162 protected void _setIntLE(int index, int value) {
163 HeapByteBufUtil.setIntLE(memory, idx(index), value);
164 }
165
166 @Override
167 protected void _setLong(int index, long value) {
168 HeapByteBufUtil.setLong(memory, idx(index), value);
169 }
170
171 @Override
172 protected void _setLongLE(int index, long value) {
173 HeapByteBufUtil.setLongLE(memory, idx(index), value);
174 }
175
176 @Override
177 public final ByteBuf setBytes(int index, ByteBuf src, int srcIndex, int length) {
178 checkSrcIndex(index, length, srcIndex, src.capacity());
179 if (src.hasMemoryAddress() && PlatformDependent.hasUnsafe()) {
180 PlatformDependent.copyMemory(src.memoryAddress() + srcIndex, memory, idx(index), length);
181 } else if (src.hasArray()) {
182 setBytes(index, src.array(), src.arrayOffset() + srcIndex, length);
183 } else {
184 src.getBytes(srcIndex, memory, idx(index), length);
185 }
186 return this;
187 }
188
189 @Override
190 public final ByteBuf setBytes(int index, byte[] src, int srcIndex, int length) {
191 checkSrcIndex(index, length, srcIndex, src.length);
192 System.arraycopy(src, srcIndex, memory, idx(index), length);
193 return this;
194 }
195
196 @Override
197 public final ByteBuf setBytes(int index, ByteBuffer src) {
198 int length = src.remaining();
199 checkIndex(index, length);
200 src.get(memory, idx(index), length);
201 return this;
202 }
203
204 @Override
205 public final int setBytes(int index, InputStream in, int length) throws IOException {
206 checkIndex(index, length);
207 return in.read(memory, idx(index), length);
208 }
209
210 @Override
211 public final ByteBuf copy(int index, int length) {
212 checkIndex(index, length);
213 ByteBuf copy = alloc().heapBuffer(length, maxCapacity());
214 return copy.writeBytes(memory, idx(index), length);
215 }
216
217 @Override
218 final ByteBuffer duplicateInternalNioBuffer(int index, int length) {
219 checkIndex(index, length);
220 return ByteBuffer.wrap(memory, idx(index), length).slice();
221 }
222
223 @Override
224 public final boolean hasArray() {
225 return true;
226 }
227
228 @Override
229 public final byte[] array() {
230 ensureAccessible();
231 return memory;
232 }
233
234 @Override
235 public final int arrayOffset() {
236 return offset;
237 }
238
239 @Override
240 public final boolean hasMemoryAddress() {
241 return false;
242 }
243
244 @Override
245 public final long memoryAddress() {
246 throw new UnsupportedOperationException();
247 }
248
249 @Override
250 protected final ByteBuffer newInternalNioBuffer(byte[] memory) {
251 return ByteBuffer.wrap(memory);
252 }
253 }