1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  *   http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 package org.apache.thrift.transport;
20 
21 import java.util.Arrays;
22 
23 /**
24  * Helper class that wraps a byte[] so that it can expand and be reused. Users should call
25  * resizeIfNecessary to make sure the buffer has suitable capacity, and then use the array as
26  * needed. Note that the internal array will grow at a rate slightly faster than the requested
27  * capacity with the (untested) objective of avoiding expensive buffer allocations and copies.
28  */
29 public class AutoExpandingBuffer {
30   private byte[] array;
31 
AutoExpandingBuffer(int initialCapacity)32   public AutoExpandingBuffer(int initialCapacity) {
33     this.array = new byte[initialCapacity];
34   }
35 
resizeIfNecessary(int size)36   public void resizeIfNecessary(int size) {
37     final int currentCapacity = this.array.length;
38     if (currentCapacity < size) {
39       // Increase by a factor of 1.5x
40       int growCapacity = currentCapacity + (currentCapacity >> 1);
41       int newCapacity = Math.max(growCapacity, size);
42       this.array = Arrays.copyOf(array, newCapacity);
43     }
44   }
45 
array()46   public byte[] array() {
47     return this.array;
48   }
49 }
50