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