org.apache.xml.dtm.ref
Class ChunkedIntArray

java.lang.Object
  extended by org.apache.xml.dtm.ref.ChunkedIntArray

final class ChunkedIntArray
extends java.lang.Object

ChunkedIntArray is an extensible array of blocks of integers. (I'd consider Vector, but it's unable to handle integers except by turning them into Objects.)

Making this a separate class means some call-and-return overhead. But doing it all inline tends to be fragile and expensive in coder time, not to mention driving up code size. If you want to inline it, feel free. The Java text suggest that private and Final methods may be inlined, and one can argue that this beast need not be made subclassable...

%REVIEW% This has strong conceptual overlap with the IntVector class. It would probably be a good thing to merge the two, when time permits.


Nested Class Summary
(package private) static class ChunkedIntArray.ChunksVector
           
 
Field Summary
(package private) static int chunkalloc
           
(package private)  ChunkedIntArray.ChunksVector chunks
           
(package private)  int[] fastArray
           
(package private)  int lastUsed
           
(package private) static int lowbits
           
(package private) static int lowmask
           
(package private) static int slotsize
           
 
Constructor Summary
ChunkedIntArray(int slotsize)
          Create a new CIA with specified record size.
 
Method Summary
(package private)  int appendSlot(int w0, int w1, int w2, int w3)
          Append a 4-integer record to the CIA, starting with record 1.
(package private)  void discardLast()
          Disard the highest-numbered record.
(package private)  int readEntry(int position, int offset)
          Retrieve an integer from the CIA by record number and column within the record, both 0-based (though position 0 is reserved for special purposes).
(package private)  void readSlot(int position, int[] buffer)
          Retrieve the contents of a record into a user-supplied buffer array.
(package private)  int slotsUsed()
           
(package private)  int specialFind(int startPos, int position)
           
(package private)  void writeEntry(int position, int offset, int value)
          Overwrite the integer found at a specific record and column.
(package private)  void writeSlot(int position, int w0, int w1, int w2, int w3)
          Overwrite an entire (4-integer) record at the specified index.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

slotsize

static final int slotsize
See Also:
Constant Field Values

lowbits

static final int lowbits
See Also:
Constant Field Values

chunkalloc

static final int chunkalloc
See Also:
Constant Field Values

lowmask

static final int lowmask
See Also:
Constant Field Values

chunks

ChunkedIntArray.ChunksVector chunks

fastArray

final int[] fastArray

lastUsed

int lastUsed
Constructor Detail

ChunkedIntArray

ChunkedIntArray(int slotsize)
Create a new CIA with specified record size. Currently record size MUST be a power of two... and in fact is hardcoded to 4.

Method Detail

appendSlot

int appendSlot(int w0,
               int w1,
               int w2,
               int w3)
Append a 4-integer record to the CIA, starting with record 1. (Since arrays are initialized to all-0, 0 has been reserved as the "unknown" value in DTM.)

Returns:
the index at which this record was inserted.

readEntry

int readEntry(int position,
              int offset)
        throws java.lang.ArrayIndexOutOfBoundsException
Retrieve an integer from the CIA by record number and column within the record, both 0-based (though position 0 is reserved for special purposes).

Parameters:
position - int Record number
slotpos - int Column number
Throws:
java.lang.ArrayIndexOutOfBoundsException

specialFind

int specialFind(int startPos,
                int position)

slotsUsed

int slotsUsed()
Returns:
int index of highest-numbered record currently in use

discardLast

void discardLast()
Disard the highest-numbered record. This is used in the string-buffer CIA; when only a single characters() chunk has been recieved, its index is moved into the Text node rather than being referenced by indirection into the text accumulator.


writeEntry

void writeEntry(int position,
                int offset,
                int value)
          throws java.lang.ArrayIndexOutOfBoundsException
Overwrite the integer found at a specific record and column. Used to back-patch existing records, most often changing their "next sibling" reference from 0 (unknown) to something meaningful

Parameters:
position - int Record number
offset - int Column number
value - int New contents
Throws:
java.lang.ArrayIndexOutOfBoundsException

writeSlot

void writeSlot(int position,
               int w0,
               int w1,
               int w2,
               int w3)
Overwrite an entire (4-integer) record at the specified index. Mostly used to create record 0, the Document node.

Parameters:
position - integer Record number
w0 - int
w1 - int
w2 - int
w3 - int

readSlot

void readSlot(int position,
              int[] buffer)
Retrieve the contents of a record into a user-supplied buffer array. Used to reduce addressing overhead when code will access several columns of the record.

Parameters:
position - int Record number
buffer - int[] Integer array provided by user, must be large enough to hold a complete record.