package org.maachang.jni.io ;

/**
 * Snappy圧縮／解凍.
 * 
 * @version 2012/11/07
 * @author  masahito suzuki
 * @since   SeabassNativeIO-1.0.3
 */
public abstract class Snappy {
    private Snappy() {}
    
    /**
     * 圧縮バッファサイズの計算
     * @param len 圧縮対象のメモリサイズを設定します.
     * @return 圧縮バッファでの最大サイズが返却されます.
     */
    public static final int calcMaxCompressLength( int len ) {
        return 32 + len + ( len / 6 );
    }
    
    /**
     * 圧縮バッファの取得.
     * @param len 圧縮対象のメモリサイズを設定します.
     * @return long 新しい圧縮バッファが返却されます.
     */
    public static final long createMaxCompressBuffer( int len ) {
        return NativeIO.malloc( calcMaxCompressLength( len ) ) ;
    }
    
    /**
     * 圧縮処理.
     * @param src 圧縮対象のメモリポインタを設定します.
     * @param src_len 圧縮対象の長さを設定します.
     * @param dest 圧縮結果のメモリポインタを設定します.
     * @return long 圧縮結果のサイズが返却されます.
     */
    public static int compress( long src,int src_len,long dest ) {
        int[] ret = new int[ 1 ] ;
        NativeIO.snappyCompress( src,src_len,dest,ret ) ;
        return ret[ 0 ] ;
    }
    
    /**
     * 解凍処理.
     * <p>解凍時には、予め圧縮サイズを把握した上で処理しなければならない.</p>
     * @param src 解凍対象のメモリポインタを設定します.
     * @param src_len 解凍対象の長さを設定します.
     * @param dst 解凍結果が格納されるメモリポインタを設定します.
     * @return int 解凍結果のサイズが返却されます.<br>
     *             また[-1]が返却された場合、解凍処理に失敗しました.
     */
    public static int decompress( long src,int src_len,long dst ) {
        int[] ret = new int[ 1 ] ;
        if( NativeIO.snappyDecompress( src,src_len,dst,ret ) >= 0 ) {
            return ret[ 0 ] ;
        }
        return -1 ;
    }
}
