/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 */
package org.logical_paradox.common.lang;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import org.logical_paradox.common.io.ByteStream;

/**
 * バイト列化可能なLongラッパー
 * バイト列化した場合，LongはBIG_ENDIANで格納される
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class LongByteStream implements ByteStream {
	private final Long value;
	private final byte[] bstream;

	/**
	 * コンストラクタ
	 * @param l 値オブジェクト
	 */	
	public LongByteStream(Long l) {
		value = l;
		bstream = objectToByteStream(l.longValue());
	}
	/**
	 * コンストラクタ
	 * @param l 値
	 */
	public LongByteStream(long l) {
		this(new Long(l));
	}
	/**
	 * Long型のオブジェクトを返す
	 * @return 値オブジェクト
	 */
	public Long getLongObject() {
		return value;
	}
	/**
	 * long値を返す
	 * @return 値
	 */
	public long longValue() {
		return value.longValue();
	}
	/**
	 * このオブジェクトをバイト列に変換して返す
	 * バイト列への変換は，コンストラクタ呼び出し時に行われているので，
	 * ここでは単にそれを返すだけ
	 * @return バイト列
	 */
	public byte[] byteStream() {
		return bstream;
	}
	/**
	 * 値オブジェクトからバイト列へ変換して返す
	 * @param l 値
	 * @return バイト列
	 */
	protected byte[] objectToByteStream(long l) {
		ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.BIG_ENDIAN);
		buffer.rewind();
		buffer.putLong(l);
		
		return buffer.array();
	}
}

// end of LongByteStream.java
