case BufferType.CONTAINED: { mylog ( "read[CONT] " + t.toBlockString ( t.ofsR, t.length ) );  ByteBuffer buf = ByteBuffer.allocate ( alignment ); parentApi.read ( t.start, buf ); t.copyFrom ( buf, t.ofsR, t.length ); } break;
mylog("\n" + t);
    public void read ( long offset, ByteBuffer dst )	throws IOException {	BufferType t = new BufferType ( offset, dst );			mylog ( "\n" + t );		switch ( t.type ) {	case BufferType.EMPTY:	    break;	case BufferType.CONTAINED:	    {		mylog ( "read[CONT] " + t.toBlockString ( t.ofsR, t.length ) );		//		ByteBuffer buf = ByteBuffer.allocate ( alignment );		parentApi.read ( t.start, buf );		t.copyFrom ( buf, t.ofsR, t.length );	    }	    break;	case BufferType.CROSSED:	    if ( t.ofsR != 0 ) {		mylog ( "read[HEAD] " + t.toBlockString ( t.ofsR, alignment - t.ofsR ) );		//		ByteBuffer buf = ByteBuffer.allocate ( alignment );		parentApi.read ( t.start, buf );		t.copyFrom ( buf, t.ofsR, alignment - t.ofsR );	    }	    //	    if ( t.nB != 0 ) {		mylog ( "read[BODY] " + t.toBlockString ( t.start + alignment, t.lB ) );		//		t.limit ( t.lB );		parentApi.read ( t.start + alignment, dst );		t.restore();	    }	    //	    if ( t.lstR != 0 ) {		mylog ( "read[TAIL] " + t.toBlockString ( t.end - alignment, t.lstR ) );		//		ByteBuffer buf = ByteBuffer.allocate ( alignment );		parentApi.read ( t.end - alignment, buf );		t.copyFrom ( buf, 0, t.lstR );	    }	    break;	case BufferType.ALIGNED:	    mylog ( "read[ALGN] " + t.toBlockString ( t.offset, t.length ) );	    //	    parentApi.read ( offset, dst );	    break;	default:	    throw new IllegalArgumentException		    ( "no type: shouldn't happen" );	}    }