package pt.minha.models.global.io; import java.nio.ByteBuffer; public class Buffer { private static final int bufferSize = 32*1024; private final byte[] buffer = new byte[bufferSize]; private int h, t, n; private boolean closed; public int push(ByteBuffer b) { if (closed) return -1; int done = 0; while(b.hasRemaining() && n<bufferSize) { int op = b.remaining(); if (op > bufferSize-n) op = bufferSize-n; if (op > bufferSize-h) op = bufferSize-h; b.get(buffer, h, op); done += op; n += op; h = (h + op) % bufferSize; } return done; } public int push(byte[] data, int offset, int len) { if (closed) return -1; int done = 0; while(len-done>0 && n<bufferSize) { int op = len-done; if (op > bufferSize-n) op = bufferSize-n; if (op > bufferSize-h) op = bufferSize-h; System.arraycopy(data, offset+done, buffer, h, op); done += op; n += op; h = (h + op) % bufferSize; } return done; } public int pop(ByteBuffer b) { if (closed && n==0) return -1; int done = 0; while(b.remaining()>0 && n>0) { int op = b.remaining(); if (op > n) op = n; if (op > bufferSize-t) op = bufferSize-t; b.put(buffer, t, op); done += op; n -= op; t = (t + op) % bufferSize; } return done; } public int pop(byte[] data, int offset, int len) { if (closed && n==0) return -1; int done = 0; while(len-done>0 && n>0) { int op = len-done; if (op > n) op = n; if (op > bufferSize-t) op = bufferSize-t; System.arraycopy(buffer, t, data, offset+done, op); done += op; n -= op; t = (t + op) % bufferSize; } return done; } public int getUsed() { return n; } public int getFree() { return bufferSize-n; } public void close(boolean linger) { if (!linger) n = 0; closed = true; } public boolean isClosing() { return closed; } public boolean isClosed() { return closed && n==0; } }