|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.exist.util.FastStringBuffer
Copied this class from Xalan and adopted it for eXist. Bare-bones, unsafe, fast string buffer. No thread-safety, no parameter range checking, exposed fields. Note that in typical applications, thread-safety of a StringBuffer is a somewhat dubious concept in any case.
Note that Stree and DTM used a single FastStringBuffer as a string pool, by recording start and length indices within this single buffer. This minimizes heap overhead, but of course requires more work when retrieving the data.
FastStringBuffer operates as a "chunked buffer". Doing so reduces the need to recopy existing information when an append exceeds the space available; we just allocate another chunk and flow across to it. (The array of chunks may need to grow, admittedly, but that's a much smaller object.) Some excess recopying may arise when we extract Strings which cross chunk boundaries; larger chunks make that less frequent.
The size values are parameterized, to allow tuning this code. In theory, Result Tree Fragments might want to be tuned differently from the main document's text.
%REVIEW% An experiment in self-tuning is included in the code (using nested FastStringBuffers to achieve variation in chunk sizes), but this implementation has proven to be problematic when data may be being copied from the FSB into itself. We should either re-architect that to make this safe (if possible) or remove that code and clean up for performance/maintainability reasons.
Field Summary | |
static int |
SUPPRESS_BOTH
Manefest constant: Suppress both leading and trailing whitespace. |
static int |
SUPPRESS_LEADING_WS
Manefest constant: Suppress leading whitespace. |
static int |
SUPPRESS_TRAILING_WS
Manefest constant: Suppress trailing whitespace. |
Constructor Summary | |
FastStringBuffer()
Construct a FastStringBuffer, using a default allocation policy. |
|
FastStringBuffer(int initChunkBits)
Construct a FastStringBuffer, using default maxChunkBits and rebundleBits values. |
|
FastStringBuffer(int initChunkBits,
int maxChunkBits)
Construct a FastStringBuffer, using a default rebundleBits value. |
|
FastStringBuffer(int initChunkBits,
int maxChunkBits,
int rebundleBits)
Construct a FastStringBuffer, with allocation policy as per parameters. |
Method Summary | |
void |
append(char value)
Append a single character onto the FastStringBuffer, growing the storage if necessary. |
void |
append(char[] chars,
int start,
int length)
Append part of the contents of a Character Array onto the FastStringBuffer, growing the storage if necessary. |
void |
append(FastStringBuffer value)
Append the contents of another FastStringBuffer onto this FastStringBuffer, growing the storage if necessary. |
void |
append(java.lang.String value)
Append the contents of a String onto the FastStringBuffer, growing the storage if necessary. |
void |
append(java.lang.StringBuffer value)
Append the contents of a StringBuffer onto the FastStringBuffer, growing the storage if necessary. |
char |
charAt(int pos)
Get a single character from the string buffer. |
void |
copyTo(char[] newBuf,
int offset)
Description of the Method |
java.lang.String |
getNormalizedString(int mode)
Gets the normalizedString attribute of the FastStringBuffer object |
java.lang.StringBuffer |
getNormalizedString(java.lang.StringBuffer sb,
int mode)
Gets the normalizedString attribute of the FastStringBuffer object |
java.lang.StringBuffer |
getString()
Gets the string attribute of the FastStringBuffer object |
java.lang.String |
getString(int start,
int length)
|
java.lang.StringBuffer |
getString(java.lang.StringBuffer buf)
Gets the string attribute of the FastStringBuffer object |
static boolean |
isWhiteSpace(char ch)
Gets the whiteSpace attribute of the FastStringBuffer class |
boolean |
isWhitespace(int start,
int length)
|
int |
length()
Get the length of the list. |
void |
reset()
Discard the content of the FastStringBuffer, and most of the memory that was allocated by it, restoring the initial state. |
void |
setLength(int l)
Directly set how much of the FastStringBuffer's storage is to be considered part of its content. |
int |
size()
Get the length of the list. |
java.lang.CharSequence |
subSequence(int start,
int end)
|
java.lang.String |
toString()
Note that this operation has been somewhat deoptimized by the shift to a chunked array, as there is no factory method to produce a String object directly from an array of arrays and hence a double copy is needed. |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
public static final int SUPPRESS_LEADING_WS
sendNormalizedSAXcharacters(char[],int,int,org.xml.sax.ContentHandler,int)
,
Constant Field Valuespublic static final int SUPPRESS_TRAILING_WS
public static final int SUPPRESS_BOTH
sendNormalizedSAXcharacters(char[],int,int,org.xml.sax.ContentHandler,int)
,
Constant Field ValuesConstructor Detail |
public FastStringBuffer(int initChunkBits, int maxChunkBits, int rebundleBits)
For coding convenience, I've expressed both allocation sizes in terms of a number of bits. That's needed for the final size of a chunk, to permit fast and efficient shift-and-mask addressing. It's less critical for the inital size, and may be reconsidered.
An alternative would be to accept integer sizes and round to powers of two; that really doesn't seem to buy us much, if anything.
initChunkBits
- Length in characters of the initial allocation of a
chunk, expressed in log-base-2. (That is, 10 means allocate 1024
characters.) Later chunks will use larger allocation units, to trade
off allocation speed of large document against storage efficiency of
small ones.maxChunkBits
- Number of character-offset bits that should be used
for addressing within a chunk. Maximum length of a chunk is
2^chunkBits characters.rebundleBits
- Number of character-offset bits that addressing
should advance before we attempt to take a step from initChunkBits
to maxChunkBitspublic FastStringBuffer(int initChunkBits, int maxChunkBits)
initChunkBits
- NEEDSDOCmaxChunkBits
- public FastStringBuffer(int initChunkBits)
ISSUE: Should this call assert initial size, or fixed size? Now configured as initial, with a default for fixed.
initChunkBits
- public FastStringBuffer()
Method Detail |
public final int size()
public final int length()
length
in interface java.lang.CharSequence
public final void reset()
public final void setLength(int l)
l
- New length. If l<0 or l>=getLength(), this operation will not
report an error but future operations will almost certainly fail.public final java.lang.String toString()
(It really is a pity that Java didn't design String as a final subclass of MutableString, rather than having StringBuffer be a separate hierarchy. We'd avoid a lot of double-buffering.)
toString
in interface java.lang.CharSequence
public final void append(char value)
NOTE THAT after calling append(), previously obtained references to m_array[][] may no longer be valid.... though in fact they should be in this instance.
value
- character to be appended.public final void append(java.lang.String value)
NOTE THAT after calling append(), previously obtained references to m_array[] may no longer be valid.
value
- String whose contents are to be appended.public final void append(java.lang.StringBuffer value)
NOTE THAT after calling append(), previously obtained references to m_array[] may no longer be valid.
value
- StringBuffer whose contents are to be appended.public final void append(char[] chars, int start, int length)
NOTE THAT after calling append(), previously obtained references to m_array[] may no longer be valid.
chars
- character array from which data is to be copiedstart
- offset in chars of first character to be copied,
zero-based.length
- number of characters to be copiedpublic final void append(FastStringBuffer value)
NOTE THAT after calling append(), previously obtained references to m_array[] may no longer be valid.
value
- FastStringBuffer whose contents are to be appended.public boolean isWhitespace(int start, int length)
start
- Offset of first character in the range.length
- Number of characters to send.
CURRENTLY DOES NOT CHECK FOR OUT-OF-RANGE.
public java.lang.String getString(int start, int length)
start
- Offset of first character in the range.length
- Number of characters to send.
public java.lang.StringBuffer getString()
public java.lang.StringBuffer getString(java.lang.StringBuffer buf)
buf
- Description of the Parameter
public void copyTo(char[] newBuf, int offset)
newBuf
- Description of the Parameteroffset
- Description of the Parameterpublic static boolean isWhiteSpace(char ch)
ch
- Description of the Parameter
public java.lang.String getNormalizedString(int mode)
mode
- Description of the Parameter
public java.lang.StringBuffer getNormalizedString(java.lang.StringBuffer sb, int mode)
sb
- Description of the Parametermode
- Description of the Parameter
public char charAt(int pos)
charAt
in interface java.lang.CharSequence
pos
- character position requested.
public java.lang.CharSequence subSequence(int start, int end)
subSequence
in interface java.lang.CharSequence
CharSequence.subSequence(int, int)
|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |