Swap the directionality of the links in Cell.

This commit is contained in:
Marcin Olawski 2015-02-08 22:38:56 +01:00
parent 0537cb4775
commit a5ff62fbad

View File

@ -13,7 +13,8 @@ package java.io;
public class ByteArrayOutputStream extends OutputStream { public class ByteArrayOutputStream extends OutputStream {
private static final int BufferSize = 32; private static final int BufferSize = 32;
private Cell chain; private Cell firstCell;
private Cell curCell;
private int length; private int length;
private byte[] buffer; private byte[] buffer;
private int position; private int position;
@ -25,7 +26,8 @@ public class ByteArrayOutputStream extends OutputStream {
} }
public void reset() { public void reset() {
chain = null; firstCell = null;
curCell = null;
length = 0; length = 0;
buffer = null; buffer = null;
position = 0; position = 0;
@ -69,19 +71,30 @@ public class ByteArrayOutputStream extends OutputStream {
position += length; position += length;
} else { } else {
flushBuffer(); flushBuffer();
chain = new Cell(copy(b, offset, length), 0, length, chain); chainCell( new Cell(copy(b, offset, length), 0, length) );
} }
this.length += length; this.length += length;
} }
private void chainCell(Cell cell){
if (curCell == null){
firstCell = cell;
curCell = cell;
}else{
curCell.next = cell;
curCell = cell;
}
}
private void flushBuffer() { private void flushBuffer() {
if (position > 0) { if (position > 0) {
byte[] b = buffer; byte[] b = buffer;
int p = position; int p = position;
buffer = null; buffer = null;
position = 0; position = 0;
chain = new Cell(b, 0, p, chain);
chainCell( new Cell(b, 0, p) );
} }
} }
@ -89,33 +102,24 @@ public class ByteArrayOutputStream extends OutputStream {
flushBuffer(); flushBuffer();
byte[] array = new byte[length]; byte[] array = new byte[length];
int index = length; int pos = 0;
for (Cell c = chain; c != null; c = c.next) { for (Cell c = firstCell; c != null; c = c.next) {
int start = index - c.length; System.arraycopy(c.array, c.offset, array, pos, c.length);
System.arraycopy(c.array, c.offset, array, start, c.length); pos += c.length;
index = start;
} }
return array; return array;
} }
public synchronized void writeTo(OutputStream out) throws IOException { public synchronized void writeTo(OutputStream out) throws IOException {
if (length==0) if (length==0) return;
return;
if (out == null){
throw new NullPointerException();
}
flushBuffer(); flushBuffer();
int cnt = 0; for (Cell c = firstCell; c != null; c = c.next) {
for (Cell c = chain; c != null; c = c.next) {
cnt++;
}
Cell[] cellArray = new Cell[cnt];
for (Cell c = chain; c != null; c = c.next) {
cellArray[--cnt] = c;
}
for (Cell c : cellArray){
out.write(c.array, c.offset, c.length); out.write(c.array, c.offset, c.length);
} }
} }
@ -133,13 +137,12 @@ public class ByteArrayOutputStream extends OutputStream {
public byte[] array; public byte[] array;
public int offset; public int offset;
public int length; public int length;
public Cell next; public Cell next = null;
public Cell(byte[] array, int offset, int length, Cell next) { public Cell(byte[] array, int offset, int length) {
this.array = array; this.array = array;
this.offset = offset; this.offset = offset;
this.length = length; this.length = length;
this.next = next;
} }
} }
} }