package com.yuxue.util;

import org.bytedeco.javacpp.BytePointer;

/**
 * There are 3 kinds of convert functions:
 * 1. [float|double|int|long] to[Float|Double|Int|Long](BytePointer pointer)
 * 2. byte[] getBytes([float|double|int|long] value)
 * 3. [float|double|int|long] to[Float|Double|Int|Long](byte[] value)
 * 
 * @author lin.yao
 * 
 */
public class Convert {

    public static float toFloat(BytePointer pointer) {
        byte[] buffer = new byte[4];
        pointer.get(buffer);
        return toFloat(buffer);
    }

    public static double toDouble(BytePointer pointer) {
        byte[] buffer = new byte[8];
        pointer.get(buffer);
        return toDouble(buffer);
    }

    public static int toInt(BytePointer pointer) {
        byte[] buffer = new byte[4];
        pointer.get(buffer);
        return toInt(buffer);
    }

    public static long toLong(BytePointer pointer) {
        byte[] buffer = new byte[8];
        pointer.get(buffer);
        return toLong(buffer);
    }

    public static byte[] getBytes(float value) {
        return getBytes(Float.floatToIntBits(value));
    }

    public static byte[] getBytes(double value) {
        return getBytes(Double.doubleToLongBits(value));
    }

    public static byte[] getBytes(int value) {
        final int length = 4;
        byte[] buffer = new byte[length];
        for (int i = 0; i < length; ++i)
            buffer[i] = (byte) ((value >> (i * 8)) & 0xFF);
        return buffer;
    }

    public static byte[] getBytes(long value) {
        final int length = 8;
        byte[] buffer = new byte[length];
        for (int i = 0; i < length; ++i)
            buffer[i] = (byte) ((value >> (i * 8)) & 0xFF);
        return buffer;
    }

    public static int toInt(byte[] value) {
        final int length = 4;
        int n = 0;
        for (int i = 0; i < length; ++i)
            n += (value[i] & 0xFF) << (i * 8);
        return n;
    }

    public static long toLong(byte[] value) {
        final int length = 8;
        long n = 0;
        for (int i = 0; i < length; ++i)
            n += ((long) (value[i] & 0xFF)) << (i * 8);
        return n;
    }

    public static double toDouble(byte[] value) {
        return Double.longBitsToDouble(toLong(value));
    }

    public static float toFloat(byte[] value) {
        return Float.intBitsToFloat(toInt(value));
    }
}
