javap/src/main/java/org/apidesign/javap/TypeArray.java
author Lubomir Nerad <lubomir.nerad@oracle.com>
Fri, 07 Dec 2012 15:02:35 +0100
branchregisters
changeset 281 f2352e0b713e
child 307 eaf4e8387065
permissions -rw-r--r--
Type specific stack variables
     1 /*
     2  * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 
    26 package org.apidesign.javap;
    27 
    28 public class TypeArray {
    29     private static final int CAPACITY_INCREMENT = 16;
    30 
    31     private int[] types;
    32     private int size;
    33 
    34     public void add(final int newType) {
    35         ensureCapacity(size + 1);
    36         types[size++] = newType;
    37     }
    38 
    39     public void addAll(final int[] newTypes) {
    40         if (newTypes.length > 0) {
    41             ensureCapacity(size + newTypes.length);
    42             arraycopy(newTypes, 0, types, size, newTypes.length);
    43             size += newTypes.length;
    44         }
    45     }
    46 
    47     public void setAll(final int[] newTypes) {
    48         if (newTypes.length > 0) {
    49             ensureCapacity(newTypes.length);
    50             arraycopy(newTypes, 0, types, 0, newTypes.length);
    51             size = newTypes.length;
    52         } else {
    53             clear();
    54         }
    55     }
    56 
    57     public void setSize(final int newSize) {
    58         ensureCapacity(newSize);
    59         size = newSize;
    60     }
    61 
    62     public void clear() {
    63         size = 0;
    64     }
    65 
    66     public int getSize() {
    67         return size;
    68     }
    69 
    70     public int get(final int index) {
    71         return types[index];
    72     }
    73 
    74     private void ensureCapacity(final int minCapacity) {
    75         if ((minCapacity == 0)
    76                 || (types != null) && (minCapacity <= types.length)) {
    77             return;
    78         }
    79 
    80         final int newCapacity =
    81                 ((minCapacity + CAPACITY_INCREMENT - 1) / CAPACITY_INCREMENT)
    82                     * CAPACITY_INCREMENT;
    83         final int[] newTypes = new int[newCapacity];
    84 
    85         if (size > 0) {
    86             arraycopy(types, 0, newTypes, 0, size);
    87         }
    88 
    89         types = newTypes;
    90     }
    91 
    92     // no System.arraycopy
    93     private void arraycopy(final int[] src, final int srcPos,
    94                            final int[] dest, final int destPos,
    95                            final int length) {
    96         for (int i = 0; i < length; ++i) {
    97             dest[destPos + i] = src[srcPos + i];
    98         }
    99     }
   100 }