package org.maachang.jni.io;

import java.nio.ByteBuffer;

/**
 * Seabass-NativeI/Oファクトリ.
 * <p>基本的にこのファクトリを利用して、オブジェクトを生成します.</p>
 * 
 * @version 2011/06/30
 * @author  masahito suzuki
 * @since   SeabassNativeIO-1.0.2
 */
public abstract class SeabassNativeIOFactory {
    private SeabassNativeIOFactory(){}
    
    protected static boolean _fastFlag = false ;
    
    /**
     * メモリバッファを作成.
     * @param length Native生成するメモリサイズを設定します.
     * @return NativeBuffer 生成されたメモリバッファが返されます.
     */
    public static final NativeBuffer newInstanceMemory( int length ) {
        if( _fastFlag ) {
            return new FastMemoryBuffer( length ) ;
        }
        return new MemoryBuffer( length ) ;
    }
    
    /**
     * DirectByteBufferをメモリバッファとして生成.
     * @param buf 対象のDirectByteBufferを設定します.
     * @return NativeByteBuffer ByteBufferNativeアクセス用バッファが返されます.
     * @exception Exception 例外.
     */
    public static final NativeByteBuffer newInstanceByteBuffer( ByteBuffer buf )
        throws Exception {
        if( _fastFlag ) {
            return new FastMemoryByteBuffer( buf ) ;
        }
        return new MemoryByteBuffer( buf ) ;
    }
    
    /**
     * DirectByteBufferをメモリバッファとして生成.
     * @param buf 対象のDirectByteBufferを設定します.
     * @param offset 対象のオフセット値を設定します.
     * @param length 対象のデータ長を設定します.
     * @return NativeByteBuffer ByteBufferNativeアクセス用バッファが返されます.
     * @exception Exception 例外.
     */
    public static final NativeByteBuffer newInstanceByteBuffer( ByteBuffer buf,int offset,int length )
        throws Exception {
        if( _fastFlag ) {
            return new FastMemoryByteBuffer( buf,offset,length ) ;
        }
        return new MemoryByteBuffer( buf,offset,length ) ;
    }
    
    /**
     * ランダムファイルI/Oオブジェクトを生成.
     * @param opt ファイルアクセスオプションを設定します.
     * @param name 対象のファイル名を設定します.
     * @return NativeRandomIO ランダムファイルI/Oオブジェクトが返されます.
     * @exception Exception 例外.
     */
    public static final NativeRandomIO newInstanceRandomIO( int opt,String name )
        throws Exception {
        if( _fastFlag ) {
            return new FastNativeRandomIO( opt,name ) ;
        }
        return new NativeRandomIO( opt,name ) ;
    }
    
    /**
     * Fastオブジェクトを生成するかチェック.
     * @return boolean [true]の場合、Fastオブジェクトとして生成されます.
     */
    public static final boolean isFastMode() {
        return _fastFlag ;
    }
    
    /**
     * Fastオブジェクトで生成するか設定.
     * @param mode [true]の場合、Fastオブジェクトとして生成されます.
     * @return boolean 前回のモードが返されます.
     */
    public static final boolean setFastMode( boolean mode ) {
        boolean ret = _fastFlag ;
        _fastFlag = mode ;
        return ret ;
    }
    
    
}

