You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2004/12/18 05:58:25 UTC

svn commit: r122709 - in incubator/directory/network/trunk/mina/src/java/org/apache/mina: io/socket util

Author: trustin
Date: Fri Dec 17 20:58:24 2004
New Revision: 122709

URL: http://svn.apache.org/viewcvs?view=rev&rev=122709
Log:
 * Added: Pulled out some general ByteByteBuffer manipulation methods to AbstractReadBuffer and AbstractWriteBuffer

Added:
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java   (contents, props changed)
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java   (contents, props changed)
Modified:
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java
   incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java?view=diff&rev=122709&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java&r1=122708&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java&r2=122709
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpReadBuffer.java	Fri Dec 17 20:58:24 2004
@@ -19,10 +19,9 @@
 package org.apache.mina.io.socket;
 
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 
 import org.apache.mina.io.ReadBuffer;
-import org.apache.mina.io.WriteBuffer;
+import org.apache.mina.util.AbstractReadBuffer;
 
 /**
  * TODO Document me.
@@ -30,218 +29,14 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$,
  */
-class TcpReadBuffer implements ReadBuffer
+class TcpReadBuffer extends AbstractReadBuffer implements ReadBuffer
 {
     private final TcpSession parent;
 
-    private final ByteBuffer buf;
-
-    private int baseIndex;
-
     TcpReadBuffer( TcpSession parent, ByteBuffer buf )
     {
+        super(buf);
         this.parent = parent;
-        this.buf = buf;
-    }
-
-    ByteBuffer buf()
-    {
-        return buf;
-    }
-
-    void markBaseIndex()
-    {
-        baseIndex = buf.position();
-    }
-
-    public ReadBuffer get( byte[] dst )
-    {
-        buf.get( dst );
-        return this;
-    }
-
-    public ReadBuffer get( byte[] dst, int offset, int length )
-    {
-        buf.get( dst, offset, length );
-        return this;
-    }
-
-    public ReadBuffer get( ByteBuffer buf )
-    {
-        buf.put( this.buf );
-        return this;
-    }
-
-    public ReadBuffer get( WriteBuffer buf )
-    {
-        buf.put( this.buf );
-        return this;
-    }
-
-    public int getAsPossible( ByteBuffer buf )
-    {
-        int length = Math.min( buf.remaining(), this.buf.remaining() );
-        if( length > 0 )
-        {
-            int oldLimit = buf.limit();
-            buf.limit( buf.position() + length );
-            buf.put( this.buf );
-            buf.limit( oldLimit );
-        }
-        return length;
-    }
-
-    public int getAsPossible( WriteBuffer buf )
-    {
-        return buf.putAsPossible( this );
-    }
-
-    public byte get()
-    {
-        return buf.get();
-    }
-
-    public char getChar()
-    {
-        char ret = buf.getChar();
-        return ret;
-    }
-
-    public double getDouble()
-    {
-        return buf.getDouble();
-    }
-
-    public float getFloat()
-    {
-        return buf.getFloat();
-    }
-
-    public int getInt()
-    {
-        return buf.getInt();
-    }
-
-    public long getLong()
-    {
-        return buf.getLong();
-    }
-
-    public short getShort()
-    {
-        return buf.getShort();
-    }
-
-    public byte get( int index )
-    {
-        checkIndex( index );
-        return buf.get( baseIndex + index );
-    }
-
-    public char getChar( int index )
-    {
-        checkIndex( index );
-        char ret = buf.getChar( baseIndex + index );
-        return ret;
-    }
-
-    public double getDouble( int index )
-    {
-        checkIndex( index );
-        return buf.getDouble( baseIndex + index );
-    }
-
-    public float getFloat( int index )
-    {
-        checkIndex( index );
-        return buf.getFloat( baseIndex + index );
-    }
-
-    public int getInt( int index )
-    {
-        checkIndex( index );
-        return buf.getInt( baseIndex + index );
-    }
-
-    public long getLong( int index )
-    {
-        checkIndex( index );
-        return buf.getLong( baseIndex + index );
-    }
-
-    public short getShort( int index )
-    {
-        checkIndex( index );
-        return buf.getShort( baseIndex + index );
-    }
-
-    public ByteOrder order()
-    {
-        return buf.order();
-    }
-
-    public ReadBuffer order( ByteOrder order )
-    {
-        buf.order( order );
-        return this;
-    }
-
-    public ByteBuffer asByteBuffer()
-    {
-        return buf.duplicate().asReadOnlyBuffer();
-    }
-
-    public boolean hasRemaining()
-    {
-        return buf.hasRemaining();
-    }
-
-    public int position()
-    {
-        return buf.position() - baseIndex;
-    }
-
-    public ReadBuffer position( int index )
-    {
-        checkIndex( index );
-        buf.position( baseIndex + index );
-        return this;
-    }
-
-    public ReadBuffer skip( int length )
-    {
-        int newIndex = buf.position() + length;
-        if( newIndex < baseIndex )
-            throw new IllegalArgumentException();
-        buf.position( buf.position() + length );
-        return this;
-    }
-
-    public ReadBuffer skipAll()
-    {
-        return skip( remaining() );
-    }
-
-    public int capacity()
-    {
-        return buf.capacity();
-    }
-
-    public int remaining()
-    {
-        return buf.remaining();
-    }
-
-    public ReadBuffer mark()
-    {
-        buf.mark();
-        return this;
-    }
-
-    public ReadBuffer reset()
-    {
-        buf.reset();
-        return this;
     }
 
     public ReadBuffer signal()
@@ -249,10 +44,15 @@
         TcpIoProcessor.getInstance().addReadableSession( parent );
         return this;
     }
+    
+    
+    protected ByteBuffer buf()
+    {
+        return super.buf();
+    }
 
-    private void checkIndex( int index )
+    protected void markBaseIndex()
     {
-        if( index < 0 )
-            throw new IllegalArgumentException();
+        super.markBaseIndex();
     }
 }

Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java?view=diff&rev=122709&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java&r1=122708&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java&r2=122709
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java	(original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpWriteBuffer.java	Fri Dec 17 20:58:24 2004
@@ -19,10 +19,9 @@
 package org.apache.mina.io.socket;
 
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 
-import org.apache.mina.io.ReadBuffer;
 import org.apache.mina.io.WriteBuffer;
+import org.apache.mina.util.AbstractWriteBuffer;
 import org.apache.mina.util.Queue;
 
 /**
@@ -31,191 +30,14 @@
  * @author Trustin Lee (trustin@apache.org)
  * @version $Rev$, $Date$,
  */
-class TcpWriteBuffer implements WriteBuffer
+class TcpWriteBuffer extends AbstractWriteBuffer implements WriteBuffer
 {
     private final TcpSession session;
 
-    private final ByteBuffer buf;
-
-    private final Queue markers = new Queue( 16 );
-
-    private int baseIndex;
-
     TcpWriteBuffer( TcpSession session, ByteBuffer buf )
     {
+        super(buf);
         this.session = session;
-        this.buf = buf;
-    }
-
-    ByteBuffer buf()
-    {
-        return buf;
-    }
-
-    void markBaseIndex()
-    {
-        baseIndex = buf.position();
-    }
-
-    public WriteBuffer put( byte[] src )
-    {
-        buf.put( src );
-        return this;
-    }
-
-    public WriteBuffer put( byte[] src, int offset, int length )
-    {
-        buf.put( src, offset, length );
-        return this;
-    }
-
-    public WriteBuffer put( ReadBuffer buf )
-    {
-        checkBufferCompatibility( buf );
-        this.buf.put( ( ( TcpReadBuffer ) buf ).buf() );
-        return this;
-    }
-
-    public WriteBuffer put( ByteBuffer buf )
-    {
-        this.buf.put( buf );
-        return this;
-    }
-
-    public int putAsPossible( ReadBuffer buf )
-    {
-        checkBufferCompatibility( buf );
-        return this.putAsPossible( ( ( TcpReadBuffer ) buf ).buf() );
-    }
-
-    public int putAsPossible( ByteBuffer buf )
-    {
-        int length = Math.min( buf.remaining(), this.buf.remaining() );
-        if( length > 0 )
-        {
-            int oldLimit = buf.limit();
-            buf.limit( buf.position() + length );
-            this.buf.put( buf );
-            buf.limit( oldLimit );
-        }
-
-        return length;
-    }
-
-    private void checkBufferCompatibility( ReadBuffer buf )
-    {
-        if( ! ( buf instanceof TcpReadBuffer ) )
-        {
-            throw new IllegalArgumentException( "Incompatible buffer type: "
-                                                + buf.getClass() );
-        }
-    }
-
-    public WriteBuffer put( byte b )
-    {
-        buf.put( b );
-        return this;
-    }
-
-    public WriteBuffer putChar( char c )
-    {
-        buf.putChar( c );
-        return this;
-    }
-
-    public WriteBuffer putDouble( double d )
-    {
-        buf.putDouble( d );
-        return this;
-    }
-
-    public WriteBuffer putFloat( float f )
-    {
-        buf.putFloat( f );
-        return this;
-    }
-
-    public WriteBuffer putInt( int i )
-    {
-        buf.putInt( i );
-        return this;
-    }
-
-    public WriteBuffer putLong( long l )
-    {
-        buf.putLong( l );
-        return this;
-    }
-
-    public WriteBuffer putShort( short s )
-    {
-        buf.putShort( s );
-        return this;
-    }
-
-    public WriteBuffer put( int index, byte b )
-    {
-        checkIndex( index );
-        buf.put( baseIndex + index, b );
-        return this;
-    }
-
-    public WriteBuffer putChar( int index, char c )
-    {
-        checkIndex( index );
-        buf.putChar( baseIndex + index, c );
-        return this;
-    }
-
-    public WriteBuffer putDouble( int index, double d )
-    {
-        checkIndex( index );
-        buf.putDouble( baseIndex + index, d );
-        return this;
-    }
-
-    public WriteBuffer putFloat( int index, float f )
-    {
-        checkIndex( index );
-        buf.putFloat( baseIndex + index, f );
-        return this;
-    }
-
-    public WriteBuffer putInt( int index, int i )
-    {
-        checkIndex( index );
-        buf.putInt( baseIndex + index, i );
-        return this;
-    }
-
-    public WriteBuffer putLong( int index, long l )
-    {
-        checkIndex( index );
-        buf.putLong( baseIndex + index, l );
-        return this;
-    }
-
-    public WriteBuffer putShort( int index, short s )
-    {
-        checkIndex( index );
-        buf.putShort( baseIndex + index, s );
-        return this;
-    }
-
-    public ByteOrder order()
-    {
-        return buf.order();
-    }
-
-    public WriteBuffer order( ByteOrder order )
-    {
-        buf.order( order );
-        return this;
-    }
-
-    public ByteBuffer asByteBuffer()
-    {
-        return buf.duplicate();
     }
 
     public WriteBuffer flush()
@@ -223,105 +45,19 @@
         session.flush();
         return this;
     }
-
-    public boolean hasRemaining()
+    
+    protected ByteBuffer buf()
     {
-        return buf.hasRemaining();
+        return super.buf();
     }
-
-    public int position()
+    
+    protected Queue getMarkers()
     {
-        return buf.position() - baseIndex;
-    }
-
-    public WriteBuffer position( int index )
-    {
-        checkIndex( index );
-        buf.position( baseIndex + index );
-        return this;
+        return super.getMarkers();
     }
-
-    public WriteBuffer clear()
-    {
-        buf.clear();
-        return this;
-    }
-
-    public int capacity()
-    {
-        return buf.capacity();
-    }
-
-    public int remaining()
-    {
-        return buf.remaining();
-    }
-
-    public WriteBuffer mark()
-    {
-        buf.mark();
-        return this;
-    }
-
-    public WriteBuffer reset()
-    {
-        buf.reset();
-        return this;
-    }
-
-    Queue getMarkers()
-    {
-        return markers;
-    }
-
-    public WriteBuffer putMarker( Object marker )
-    {
-        int bytesLeft;
-        if( markers.isEmpty() )
-        {
-            bytesLeft = buf.position();
-        }
-        else
-        {
-            bytesLeft = buf.position()
-                        - ( ( Marker ) markers.last() ).getBytesLeft();
-        }
-
-        markers.push( new Marker( marker, bytesLeft ) );
-        return this;
-    }
-
-    static class Marker
-    {
-        private final Object value;
-
-        private int bytesLeft;
-
-        private Marker( Object value, int bytesLeft )
-        {
-            this.value = value;
-            this.bytesLeft = bytesLeft;
-        }
-
-        public Object getValue()
-        {
-            return value;
-        }
-
-        public int getBytesLeft()
-        {
-            return bytesLeft;
-        }
-
-        public void setBytesLeft( int bytesLeft )
-        {
-            this.bytesLeft = bytesLeft;
-        }
-    }
-
-    private void checkIndex( int index )
+    
+    protected void markBaseIndex()
     {
-        if( index < 0 )
-            throw new IllegalArgumentException();
+        super.markBaseIndex();
     }
 }

Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java?view=auto&rev=122709
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java	Fri Dec 17 20:58:24 2004
@@ -0,0 +1,249 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import org.apache.mina.io.ReadBuffer;
+import org.apache.mina.io.WriteBuffer;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$,
+ */
+public abstract class AbstractReadBuffer implements ReadBuffer
+{
+    protected final ByteBuffer buf;
+
+    private int baseIndex;
+
+    protected AbstractReadBuffer( ByteBuffer buf )
+    {
+        this.buf = buf;
+    }
+
+    protected ByteBuffer buf()
+    {
+        return buf;
+    }
+
+    protected void markBaseIndex()
+    {
+        baseIndex = buf.position();
+    }
+
+    public ReadBuffer get( byte[] dst )
+    {
+        buf.get( dst );
+        return this;
+    }
+
+    public ReadBuffer get( byte[] dst, int offset, int length )
+    {
+        buf.get( dst, offset, length );
+        return this;
+    }
+
+    public ReadBuffer get( ByteBuffer buf )
+    {
+        buf.put( this.buf );
+        return this;
+    }
+
+    public ReadBuffer get( WriteBuffer buf )
+    {
+        buf.put( this.buf );
+        return this;
+    }
+
+    public int getAsPossible( ByteBuffer buf )
+    {
+        int length = Math.min( buf.remaining(), this.buf.remaining() );
+        if( length > 0 )
+        {
+            int oldLimit = buf.limit();
+            buf.limit( buf.position() + length );
+            buf.put( this.buf );
+            buf.limit( oldLimit );
+        }
+        return length;
+    }
+
+    public int getAsPossible( WriteBuffer buf )
+    {
+        return buf.putAsPossible( this );
+    }
+
+    public byte get()
+    {
+        return buf.get();
+    }
+
+    public char getChar()
+    {
+        char ret = buf.getChar();
+        return ret;
+    }
+
+    public double getDouble()
+    {
+        return buf.getDouble();
+    }
+
+    public float getFloat()
+    {
+        return buf.getFloat();
+    }
+
+    public int getInt()
+    {
+        return buf.getInt();
+    }
+
+    public long getLong()
+    {
+        return buf.getLong();
+    }
+
+    public short getShort()
+    {
+        return buf.getShort();
+    }
+
+    public byte get( int index )
+    {
+        checkIndex( index );
+        return buf.get( baseIndex + index );
+    }
+
+    public char getChar( int index )
+    {
+        checkIndex( index );
+        char ret = buf.getChar( baseIndex + index );
+        return ret;
+    }
+
+    public double getDouble( int index )
+    {
+        checkIndex( index );
+        return buf.getDouble( baseIndex + index );
+    }
+
+    public float getFloat( int index )
+    {
+        checkIndex( index );
+        return buf.getFloat( baseIndex + index );
+    }
+
+    public int getInt( int index )
+    {
+        checkIndex( index );
+        return buf.getInt( baseIndex + index );
+    }
+
+    public long getLong( int index )
+    {
+        checkIndex( index );
+        return buf.getLong( baseIndex + index );
+    }
+
+    public short getShort( int index )
+    {
+        checkIndex( index );
+        return buf.getShort( baseIndex + index );
+    }
+
+    public ByteOrder order()
+    {
+        return buf.order();
+    }
+
+    public ReadBuffer order( ByteOrder order )
+    {
+        buf.order( order );
+        return this;
+    }
+
+    public ByteBuffer asByteBuffer()
+    {
+        return buf.duplicate().asReadOnlyBuffer();
+    }
+
+    public boolean hasRemaining()
+    {
+        return buf.hasRemaining();
+    }
+
+    public int position()
+    {
+        return buf.position() - baseIndex;
+    }
+
+    public ReadBuffer position( int index )
+    {
+        checkIndex( index );
+        buf.position( baseIndex + index );
+        return this;
+    }
+
+    public ReadBuffer skip( int length )
+    {
+        int newIndex = buf.position() + length;
+        if( newIndex < baseIndex )
+            throw new IllegalArgumentException();
+        buf.position( buf.position() + length );
+        return this;
+    }
+
+    public ReadBuffer skipAll()
+    {
+        return skip( remaining() );
+    }
+
+    public int capacity()
+    {
+        return buf.capacity();
+    }
+
+    public int remaining()
+    {
+        return buf.remaining();
+    }
+
+    public ReadBuffer mark()
+    {
+        buf.mark();
+        return this;
+    }
+
+    public ReadBuffer reset()
+    {
+        buf.reset();
+        return this;
+    }
+
+    private void checkIndex( int index )
+    {
+        if( index < 0 )
+            throw new IllegalArgumentException();
+    }
+}
\ No newline at end of file

Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java?view=auto&rev=122709
==============================================================================
--- (empty file)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java	Fri Dec 17 20:58:24 2004
@@ -0,0 +1,318 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import org.apache.mina.io.ReadBuffer;
+import org.apache.mina.io.WriteBuffer;
+import org.apache.mina.util.Queue;
+
+/**
+ * TODO Document me.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$,
+ */
+public abstract class AbstractWriteBuffer implements WriteBuffer
+{
+    protected final ByteBuffer buf;
+
+    protected final Queue markers = new Queue( 16 );
+
+    private int baseIndex;
+
+    protected AbstractWriteBuffer( ByteBuffer buf )
+    {
+        this.buf = buf;
+    }
+
+    protected ByteBuffer buf()
+    {
+        return buf;
+    }
+
+    protected void markBaseIndex()
+    {
+        baseIndex = buf.position();
+    }
+
+    public WriteBuffer put( byte[] src )
+    {
+        buf.put( src );
+        return this;
+    }
+
+    public WriteBuffer put( byte[] src, int offset, int length )
+    {
+        buf.put( src, offset, length );
+        return this;
+    }
+
+    public WriteBuffer put( ReadBuffer buf )
+    {
+        checkBufferCompatibility( buf );
+        this.buf.put( ( ( AbstractReadBuffer ) buf ).buf() );
+        return this;
+    }
+
+    public WriteBuffer put( ByteBuffer buf )
+    {
+        this.buf.put( buf );
+        return this;
+    }
+
+    public int putAsPossible( ReadBuffer buf )
+    {
+        checkBufferCompatibility( buf );
+        return this.putAsPossible( ( ( AbstractReadBuffer ) buf ).buf() );
+    }
+
+    public int putAsPossible( ByteBuffer buf )
+    {
+        int length = Math.min( buf.remaining(), this.buf.remaining() );
+        if( length > 0 )
+        {
+            int oldLimit = buf.limit();
+            buf.limit( buf.position() + length );
+            this.buf.put( buf );
+            buf.limit( oldLimit );
+        }
+
+        return length;
+    }
+
+    private void checkBufferCompatibility( ReadBuffer buf )
+    {
+        if( ! ( buf instanceof AbstractReadBuffer ) )
+        {
+            throw new IllegalArgumentException( "Incompatible buffer type: "
+                                                + buf.getClass() );
+        }
+    }
+
+    public WriteBuffer put( byte b )
+    {
+        buf.put( b );
+        return this;
+    }
+
+    public WriteBuffer putChar( char c )
+    {
+        buf.putChar( c );
+        return this;
+    }
+
+    public WriteBuffer putDouble( double d )
+    {
+        buf.putDouble( d );
+        return this;
+    }
+
+    public WriteBuffer putFloat( float f )
+    {
+        buf.putFloat( f );
+        return this;
+    }
+
+    public WriteBuffer putInt( int i )
+    {
+        buf.putInt( i );
+        return this;
+    }
+
+    public WriteBuffer putLong( long l )
+    {
+        buf.putLong( l );
+        return this;
+    }
+
+    public WriteBuffer putShort( short s )
+    {
+        buf.putShort( s );
+        return this;
+    }
+
+    public WriteBuffer put( int index, byte b )
+    {
+        checkIndex( index );
+        buf.put( baseIndex + index, b );
+        return this;
+    }
+
+    public WriteBuffer putChar( int index, char c )
+    {
+        checkIndex( index );
+        buf.putChar( baseIndex + index, c );
+        return this;
+    }
+
+    public WriteBuffer putDouble( int index, double d )
+    {
+        checkIndex( index );
+        buf.putDouble( baseIndex + index, d );
+        return this;
+    }
+
+    public WriteBuffer putFloat( int index, float f )
+    {
+        checkIndex( index );
+        buf.putFloat( baseIndex + index, f );
+        return this;
+    }
+
+    public WriteBuffer putInt( int index, int i )
+    {
+        checkIndex( index );
+        buf.putInt( baseIndex + index, i );
+        return this;
+    }
+
+    public WriteBuffer putLong( int index, long l )
+    {
+        checkIndex( index );
+        buf.putLong( baseIndex + index, l );
+        return this;
+    }
+
+    public WriteBuffer putShort( int index, short s )
+    {
+        checkIndex( index );
+        buf.putShort( baseIndex + index, s );
+        return this;
+    }
+
+    public ByteOrder order()
+    {
+        return buf.order();
+    }
+
+    public WriteBuffer order( ByteOrder order )
+    {
+        buf.order( order );
+        return this;
+    }
+
+    public ByteBuffer asByteBuffer()
+    {
+        return buf.duplicate();
+    }
+
+    public boolean hasRemaining()
+    {
+        return buf.hasRemaining();
+    }
+
+    public int position()
+    {
+        return buf.position() - baseIndex;
+    }
+
+    public WriteBuffer position( int index )
+    {
+        checkIndex( index );
+        buf.position( baseIndex + index );
+        return this;
+    }
+
+    public WriteBuffer clear()
+    {
+        buf.clear();
+        return this;
+    }
+
+    public int capacity()
+    {
+        return buf.capacity();
+    }
+
+    public int remaining()
+    {
+        return buf.remaining();
+    }
+
+    public WriteBuffer mark()
+    {
+        buf.mark();
+        return this;
+    }
+
+    public WriteBuffer reset()
+    {
+        buf.reset();
+        return this;
+    }
+
+    protected Queue getMarkers()
+    {
+        return markers;
+    }
+
+    public WriteBuffer putMarker( Object marker )
+    {
+        int bytesLeft;
+        if( markers.isEmpty() )
+        {
+            bytesLeft = buf.position();
+        }
+        else
+        {
+            bytesLeft = buf.position()
+                        - ( ( Marker ) markers.last() ).getBytesLeft();
+        }
+
+        markers.push( new Marker( marker, bytesLeft ) );
+        return this;
+    }
+
+    public static class Marker
+    {
+        private final Object value;
+
+        private int bytesLeft;
+
+        private Marker( Object value, int bytesLeft )
+        {
+            this.value = value;
+            this.bytesLeft = bytesLeft;
+        }
+
+        public Object getValue()
+        {
+            return value;
+        }
+
+        public int getBytesLeft()
+        {
+            return bytesLeft;
+        }
+
+        public void setBytesLeft( int bytesLeft )
+        {
+            this.bytesLeft = bytesLeft;
+        }
+    }
+
+    private void checkIndex( int index )
+    {
+        if( index < 0 )
+            throw new IllegalArgumentException();
+    }
+}
\ No newline at end of file