Skip to content

Commit

Permalink
Add generic types to BufferReader and BufferWriter to allow them to b…
Browse files Browse the repository at this point in the history
…e extended.
  • Loading branch information
kuujo committed Mar 5, 2015
1 parent f31afdf commit 18048f8
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 40 deletions.
Expand Up @@ -23,7 +23,7 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public interface BufferInput<T extends BufferInput<T>> { public interface BufferInput<T extends BufferInput<?>> {


/** /**
* Reads bytes into the given byte array. * Reads bytes into the given byte array.
Expand Down
Expand Up @@ -23,7 +23,7 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public interface BufferOutput<T extends BufferOutput<T>> { public interface BufferOutput<T extends BufferOutput<?>> {


/** /**
* Writes an array of bytes to the buffer. * Writes an array of bytes to the buffer.
Expand Down
16 changes: 9 additions & 7 deletions log/src/main/java/net/kuujo/copycat/log/io/BufferReader.java
Expand Up @@ -33,14 +33,14 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public class BufferReader implements BufferInput<BufferReader>, ReferenceCounted<BufferReader>, AutoCloseable { public class BufferReader<T extends Buffer> implements BufferInput<T>, ReferenceCounted<BufferReader>, AutoCloseable {
private final AtomicInteger references; private final AtomicInteger references;
private final Buffer buffer; private final Buffer buffer;
private final ReferenceManager<BufferReader> referenceManager; private final ReferenceManager<BufferReader<T>> referenceManager;
private final BufferNavigator bufferNavigator; private final BufferNavigator bufferNavigator;
private boolean open; private boolean open;


public BufferReader(Buffer buffer, long offset, long limit, ReferenceManager<BufferReader> referenceManager) { public BufferReader(Buffer buffer, long offset, long limit, ReferenceManager<BufferReader<T>> referenceManager) {
if (buffer == null) if (buffer == null)
throw new NullPointerException("buffer cannot be null"); throw new NullPointerException("buffer cannot be null");
if (offset < 0) if (offset < 0)
Expand Down Expand Up @@ -123,17 +123,19 @@ private void checkOpen() {
} }


@Override @Override
public BufferReader read(Bytes bytes) { @SuppressWarnings("unchecked")
public T read(Bytes bytes) {
checkOpen(); checkOpen();
buffer.bytes().read(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(bytes.size())), bytes.size()); buffer.bytes().read(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(bytes.size())), bytes.size());
return this; return (T) this;
} }


@Override @Override
public BufferReader read(byte[] bytes) { @SuppressWarnings("unchecked")
public T read(byte[] bytes) {
checkOpen(); checkOpen();
buffer.bytes().read(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(bytes.length)), bytes.length); buffer.bytes().read(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(bytes.length)), bytes.length);
return this; return (T) this;
} }


@Override @Override
Expand Down
Expand Up @@ -29,9 +29,9 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public class BufferReaderPool<T extends Buffer & ReferenceCounted<? extends Buffer>> implements ReferenceManager<BufferReader> { public class BufferReaderPool<T extends Buffer & ReferenceCounted<? extends Buffer>> implements ReferenceManager<BufferReader<T>> {
private final T buffer; private final T buffer;
private final Queue<BufferReader> pool = new ArrayDeque<>(1024); private final Queue<BufferReader<T>> pool = new ArrayDeque<>(1024);


public BufferReaderPool(T buffer) { public BufferReaderPool(T buffer) {
if (buffer == null) if (buffer == null)
Expand All @@ -48,7 +48,7 @@ public BufferReader acquire() {
synchronized (pool) { synchronized (pool) {
reader = pool.poll(); reader = pool.poll();
if (reader == null) { if (reader == null) {
reader = new BufferReader(buffer, 0, 0, this); reader = new BufferReader<>(buffer, 0, 0, this);
} }
} }
} }
Expand All @@ -57,7 +57,7 @@ public BufferReader acquire() {
} }


@Override @Override
public void release(BufferReader reference) { public void release(BufferReader<T> reference) {
buffer.release(); buffer.release();
pool.add(reference); pool.add(reference);
} }
Expand Down
56 changes: 33 additions & 23 deletions log/src/main/java/net/kuujo/copycat/log/io/BufferWriter.java
Expand Up @@ -33,14 +33,14 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public class BufferWriter implements BufferOutput<BufferWriter>, ReferenceCounted<BufferWriter>, AutoCloseable { public class BufferWriter<T extends Buffer> implements BufferOutput<T>, ReferenceCounted<BufferWriter>, AutoCloseable {
private final AtomicInteger referenceCount; private final AtomicInteger referenceCount;
private final Buffer buffer; private final Buffer buffer;
private final ReferenceManager<BufferWriter> referenceManager; private final ReferenceManager<BufferWriter<T>> referenceManager;
private final BufferNavigator bufferNavigator; private final BufferNavigator bufferNavigator;
private boolean open; private boolean open;


public BufferWriter(Buffer buffer, long offset, long limit, ReferenceManager<BufferWriter> referenceManager) { public BufferWriter(Buffer buffer, long offset, long limit, ReferenceManager<BufferWriter<T>> referenceManager) {
if (buffer == null) if (buffer == null)
throw new NullPointerException("buffer cannot be null"); throw new NullPointerException("buffer cannot be null");
if (offset < 0) if (offset < 0)
Expand Down Expand Up @@ -123,73 +123,83 @@ private void checkOpen() {
} }


@Override @Override
public BufferWriter write(Bytes bytes) { @SuppressWarnings("unchecked")
public T write(Bytes bytes) {
checkOpen(); checkOpen();
buffer.bytes().write(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkWrite(bytes.size())), bytes.size()); buffer.bytes().write(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkWrite(bytes.size())), bytes.size());
return this; return (T) this;
} }


@Override @Override
public BufferWriter write(byte[] bytes) { @SuppressWarnings("unchecked")
public T write(byte[] bytes) {
checkOpen(); checkOpen();
buffer.bytes().write(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkWrite(bytes.length)), bytes.length); buffer.bytes().write(bytes, bufferNavigator.getAndSetPosition(bufferNavigator.checkWrite(bytes.length)), bytes.length);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeByte(int b) { @SuppressWarnings("unchecked")
public T writeByte(int b) {
checkOpen(); checkOpen();
buffer.bytes().writeByte(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Byte.BYTES)), b); buffer.bytes().writeByte(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Byte.BYTES)), b);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeChar(char c) { @SuppressWarnings("unchecked")
public T writeChar(char c) {
checkOpen(); checkOpen();
buffer.bytes().writeChar(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Character.BYTES)), c); buffer.bytes().writeChar(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Character.BYTES)), c);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeShort(short s) { @SuppressWarnings("unchecked")
public T writeShort(short s) {
checkOpen(); checkOpen();
buffer.bytes().writeShort(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Short.BYTES)), s); buffer.bytes().writeShort(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Short.BYTES)), s);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeInt(int i) { @SuppressWarnings("unchecked")
public T writeInt(int i) {
checkOpen(); checkOpen();
buffer.bytes().writeInt(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Integer.BYTES)), i); buffer.bytes().writeInt(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Integer.BYTES)), i);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeLong(long l) { @SuppressWarnings("unchecked")
public T writeLong(long l) {
checkOpen(); checkOpen();
buffer.bytes().writeLong(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Long.BYTES)), l); buffer.bytes().writeLong(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Long.BYTES)), l);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeFloat(float f) { @SuppressWarnings("unchecked")
public T writeFloat(float f) {
checkOpen(); checkOpen();
buffer.bytes().writeFloat(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Float.BYTES)), f); buffer.bytes().writeFloat(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Float.BYTES)), f);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeDouble(double d) { @SuppressWarnings("unchecked")
public T writeDouble(double d) {
checkOpen(); checkOpen();
buffer.bytes().writeDouble(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Double.BYTES)), d); buffer.bytes().writeDouble(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Double.BYTES)), d);
return this; return (T) this;
} }


@Override @Override
public BufferWriter writeBoolean(boolean b) { @SuppressWarnings("unchecked")
public T writeBoolean(boolean b) {
checkOpen(); checkOpen();
buffer.bytes().writeBoolean(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Byte.BYTES)), b); buffer.bytes().writeBoolean(bufferNavigator.getAndSetPosition(bufferNavigator.checkRead(Byte.BYTES)), b);
return this; return (T) this;
} }


@Override @Override
Expand Down
Expand Up @@ -29,9 +29,9 @@
* *
* @author <a href="http://github.com/kuujo">Jordan Halterman</a> * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/ */
public class BufferWriterPool<T extends Buffer & ReferenceCounted<? extends Buffer>> implements ReferenceManager<BufferWriter> { public class BufferWriterPool<T extends Buffer & ReferenceCounted<? extends Buffer>> implements ReferenceManager<BufferWriter<T>> {
private final T buffer; private final T buffer;
private final Queue<BufferWriter> pool = new ArrayDeque<>(1024); private final Queue<BufferWriter<T>> pool = new ArrayDeque<>(1024);


public BufferWriterPool(T buffer) { public BufferWriterPool(T buffer) {
if (buffer == null) if (buffer == null)
Expand All @@ -48,7 +48,7 @@ public BufferWriter acquire() {
synchronized (pool) { synchronized (pool) {
writer = pool.poll(); writer = pool.poll();
if (writer == null) { if (writer == null) {
writer = new BufferWriter(buffer, 0, 0, this); writer = new BufferWriter<>(buffer, 0, 0, this);
} }
} }
} }
Expand All @@ -57,7 +57,7 @@ public BufferWriter acquire() {
} }


@Override @Override
public void release(BufferWriter reference) { public void release(BufferWriter<T> reference) {
buffer.release(); buffer.release();
pool.add(reference); pool.add(reference);
} }
Expand Down

0 comments on commit 18048f8

Please sign in to comment.