/*
 * LOGICAL-PARADOX.ORG b-tree library
 * Copyright (C)2004,2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: BtreeKey.java,v 1.2 2005/05/16 15:36:45 rampil Exp $
 */
package org.logical_paradox.common.btree;

import java.io.Serializable;

import org.logical_paradox.common.io.ByteStream;

/**
 * B-treeのキーを管理する抽象クラス．<br>
 * 1つのページ内に複数個のキーが含まれる．<br>
 * キーの内容についてはサブクラスで実装する．<br>
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public abstract class BtreeKey implements Serializable, ByteStream {
	/**
	 * @exception BtreeException
	 */
	public BtreeKey( byte[] bstream) throws BtreeException {
		byteStreamToBtreeKey( bstream);
	}
	public BtreeKey(Object o) throws BtreeException {
		objectToBtreeKey(o);
	}
	/**
	 * オブジェクトからBtreeKeyの実体を生成する．
	 * @param o オブジェクト
	 * @throws BtreeException 実体化に失敗した
	 */
	protected abstract void objectToBtreeKey(Object o) throws BtreeException;
	/**
	 * バイト列からBtreeKeyの実体を生成する．
	 * @param bstream バイト列
	 * @throws BtreeException 実体化に失敗した
	 */
	protected abstract void byteStreamToBtreeKey( byte[] bstream) throws BtreeException;

	/**
	 * キーの文字列形式を返す．
	 * @return String キーの文字列形式
	 */
	public abstract String toString();

	/**
	 * キーを比較する．
	 * @param obj 比較対象
	 * @return boolean true: 同じである / false: 違う
	 */
	public abstract boolean equals( Object obj);

	/**
	 * 指定されたキーより小さいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this < key / false: this >= key
	 */
	public abstract boolean isLessThan( BtreeKey key);

	/**
	 * 指定されたキーより大きいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this > key / false: this <= key
	 */
	public abstract boolean isGreaterThan( BtreeKey key);

	/**
	 * キーのバイトストリームを返す．<br>
	 * 永続ストレージに対してキーを保存する際に，BtreePageによって
	 * 呼び出される．
	 * @return byte[] バイト列
	 */
	public abstract byte[] byteStream();

	/**
	 * バイトストリームにした際のサイズ
	 * @return int バイト表現にした場合のサイズ
	 */
	public int byteSize() {
		return byteStream().length;
	}
}

// end of BtreeKey.java
