001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: OpMapVector.java 1225426 2011-12-29 04:13:08Z mrglavas $ 020 */ 021 022 package org.apache.xpath.compiler; 023 024 /** 025 * 026 * Like IntVector, but used only for the OpMap array. Length of array 027 * is kept in the m_lengthPos position of the array. Only the required methods 028 * are in included here. 029 * @xsl.usage internal 030 */ 031 public class OpMapVector { 032 033 /** Size of blocks to allocate */ 034 protected int m_blocksize; 035 036 /** Array of ints */ 037 protected int m_map[]; // IntStack is trying to see this directly 038 039 /** Position where size of array is kept */ 040 protected int m_lengthPos = 0; 041 042 /** Size of array */ 043 protected int m_mapSize; 044 045 /** 046 * Construct a OpMapVector, using the given block size. 047 * 048 * @param blocksize Size of block to allocate 049 */ 050 public OpMapVector(int blocksize, int increaseSize, int lengthPos) 051 { 052 053 m_blocksize = increaseSize; 054 m_mapSize = blocksize; 055 m_lengthPos = lengthPos; 056 m_map = new int[blocksize]; 057 } 058 059 /** 060 * Get the nth element. 061 * 062 * @param i index of object to get 063 * 064 * @return object at given index 065 */ 066 public final int elementAt(int i) 067 { 068 return m_map[i]; 069 } 070 071 /** 072 * Sets the component at the specified index of this vector to be the 073 * specified object. The previous component at that position is discarded. 074 * 075 * The index must be a value greater than or equal to 0 and less 076 * than the current size of the vector. 077 * 078 * @param value object to set 079 * @param index Index of where to set the object 080 */ 081 public final void setElementAt(int value, int index) 082 { 083 if (index >= m_mapSize) 084 { 085 int oldSize = m_mapSize; 086 087 m_mapSize += m_blocksize; 088 089 int newMap[] = new int[m_mapSize]; 090 091 System.arraycopy(m_map, 0, newMap, 0, oldSize); 092 093 m_map = newMap; 094 } 095 096 m_map[index] = value; 097 } 098 099 100 /* 101 * Reset the array to the supplied size. No checking is done. 102 * 103 * @param size The size to trim to. 104 */ 105 public final void setToSize(int size) { 106 107 int newMap[] = new int[size]; 108 109 System.arraycopy(m_map, 0, newMap, 0, m_map[m_lengthPos]); 110 111 m_mapSize = size; 112 m_map = newMap; 113 114 } 115 116 }