View Javadoc
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to the License at:
5    *
6    *   https://www.apache.org/licenses/LICENSE-2.0
7    *
8    * Unless required by applicable law or agreed to in writing, software
9    * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11   * License for the specific language governing permissions and limitations
12   * under the License.
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 }