public string ToString( int startIndex, int len ) {
#if BUFFER_BUILDER_TRACING
if ( s_TraceOutput != null ) {
s_TraceOutput.WriteLine( "BufferBuilder.ToString( " + startIndex + ", " + len + " )" );
}
#endif
if ( startIndex < 0 || startIndex >= length ) {
throw new ArgumentOutOfRangeException( "startIndex" );
}
if ( len < 0 || startIndex + len > length ) {
throw new ArgumentOutOfRangeException( "len" );
}
if ( ( length <= MaxStringBuilderLength ) || ( buffersCount == 1 && lastBufferIndex == 0 ) ) {
return ( stringBuilder != null ) ? stringBuilder.ToString( startIndex, len ) : string.Empty;
}
else {
StringBuilder sb = new StringBuilder( len );
if ( stringBuilder != null ) {
if ( startIndex < stringBuilder.Length ) {
if ( len < stringBuilder.Length ) {
return stringBuilder.ToString( startIndex, len );
}
else {
sb.Append( stringBuilder.ToString( startIndex, stringBuilder.Length ) );
startIndex = 0;
}
}
else {
startIndex -= stringBuilder.Length;
}
}
int i;
for ( i = 0; i < buffersCount; i++ ) {
if ( startIndex < buffers[i].buffer.Length ) {
break;
}
startIndex -= buffers[i].buffer.Length;
}
if ( i < buffersCount ) {
int charsLeft = len;
for ( ; i < buffersCount && charsLeft > 0; i++ ) {
char[] buf = buffers[i].buffer;
int copyCount = ( buf.Length < charsLeft ) ? buf.Length : charsLeft;
sb.Append( buf, startIndex, copyCount );
startIndex = 0;
charsLeft -= copyCount;
}
}
return sb.ToString();
}
}