int endSegmentLength // End offset and length may have been affected by trimming ) { assertThingsMakeSense(start, startSegmentIndex, startSegmentOffset, startSegmentLength, end, endSegmentIndex, endSegmentOffset, endSegmentLength); this.segmentTypes = segmentTypes; this.segmentValues = segmentValues;
@Override public void writeTo(Encoder encoder, Writer out) throws IOException { if(encoder==null) { writeTo(out); } else { // TODO: If copying to another SegmentedWriter, we have a chance here to share segment list (current the StringBuilder) // First segment writeSegment( startSegmentIndex, startSegmentOffset, startSegmentLength, encoder, out ); if(endSegmentIndex!=startSegmentIndex) { // Middle segments for(int i=startSegmentIndex+1; i<endSegmentIndex; i++) { writeSegment(i, encoder, out); } // End segment writeSegment( endSegmentIndex, endSegmentOffset, endSegmentLength, encoder, out ); } } }
int newEndSegmentOffset = endSegmentOffset; int newEndSegmentLength = endSegmentLength; assertThingsMakeSense(newStart, newStartSegmentIndex, newStartSegmentOffset, newStartSegmentLength, newEnd, newEndSegmentIndex, newEndSegmentOffset, newEndSegmentLength); char ch = charAt(type, value, newStartSegmentOffset); if(!Character.isWhitespace(ch)) break TRIM_LEFT; newStart++; assertThingsMakeSense(newStart, newStartSegmentIndex, newStartSegmentOffset, newStartSegmentLength, newEnd, newEndSegmentIndex, newEndSegmentOffset, newEndSegmentLength); if(newEnd==newStart) break TRIM_LEFT; } while(newStartSegmentLength>0); assertThingsMakeSense(newStart, newStartSegmentIndex, newStartSegmentOffset, newStartSegmentLength, newEnd, newEndSegmentIndex, newEndSegmentOffset, newEndSegmentLength); char ch = charAt(type, value, newEndSegmentOffset + newEndSegmentLength - 1); if(!Character.isWhitespace(ch)) break TRIM_RIGHT; newEnd--; assertThingsMakeSense(newStart, newStartSegmentIndex, newStartSegmentOffset, newStartSegmentLength, newEnd, newEndSegmentIndex, newEndSegmentOffset, newEndSegmentLength); if(newEnd==newStart) break TRIM_RIGHT; } while(newEndSegmentLength > 0); assertThingsMakeSense(newStart, newStartSegmentIndex, newStartSegmentOffset, newStartSegmentLength, newEnd, newEndSegmentIndex, newEndSegmentOffset, newEndSegmentLength); } while(true); return new SegmentedResult( segmentTypes, segmentValues,
@Override public void writeTo(Writer out) throws IOException { // First segment writeSegment( startSegmentIndex, startSegmentOffset, startSegmentLength, out ); if(endSegmentIndex!=startSegmentIndex) { // Middle segments int i = startSegmentIndex+1; if(i<endSegmentIndex) { // if(out instanceof SegmentedWriter) System.err.println("TODO: Perform array copy of middle segments"); do { writeSegment(i++, out); } while(i<endSegmentIndex); } // End segment writeSegment( endSegmentIndex, endSegmentOffset, endSegmentLength, out ); } }
StringBuilder buffer = new StringBuilder((int)length); append(startSegmentIndex, startSegmentOffset, startSegmentLength, buffer); append(i, buffer); append(endSegmentIndex, endSegmentOffset, endSegmentLength, buffer); assert buffer.length()==length : "buffer.length()!=length: "+buffer.length()+"!="+length; toStringCache = buffer.toString();
@Override public BufferResult getResult() throws IllegalStateException { if(!isClosed) throw new IllegalStateException(); if(result==null) { if(length==0) { result = EmptyResult.getInstance(); } else { assert segmentCount>0 : "When not empty and using segments, must have at least one segment"; int endSegmentIndex = segmentCount - 1; result = new SegmentedResult( segmentTypes, segmentValues, segmentOffsets, segmentLengths, 0, // start 0, // startSegmentIndex segmentOffsets[0], segmentLengths[0], length, // end endSegmentIndex, segmentOffsets[endSegmentIndex], segmentLengths[endSegmentIndex] ); } } return result; } }