/*
 *	clipbpe.h
 *
 *	Byte Pair Encoding
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 Naoyuki Sawa
 *
 *	* Thu Jan 29 21:20:19 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- 下記の資料を参考にさせて頂きました。
 *	  「Vector - bpe - BPE圧縮/展開するコマンドラインツール」(http://www.vector.co.jp/soft/dl/winnt/util/se498916.html)
 *	  「ひそかにぐあんをめぐらして - Byte Pair Encoding・その１」(http://musyozoku211.blog118.fc2.com/blog-entry-8.html)
 *	* Fri Jan 30 21:08:25 JST 2015 Naoyuki Sawa
 *	- 「１バイトづつ展開する関数(展開ストリーム)」を高速化するために、大幅な変更を行いました。
 *	  データの特性に関係無く、「１バイトづつ展開する関数(展開ストリーム)」が常に安定した速度で動作するようになりました。
 *	  今回の変更によって、僅かに圧縮率が低下しましたが、ほとんど無視できるレベルだと思います。
 */
#ifndef __CLIP_BPE_H__
#define __CLIP_BPE_H__

/****************************************************************************
 *	BytePairEncodingエンコーダー
 ****************************************************************************/
int BytePairEncodingEncoder_Encode(const void* _src, int srcLen, void* _dst, int dstCap);
/****************************************************************************
 *	BytePairEncodingデコーダー
 ****************************************************************************/
typedef struct _ST_BytePairEncodingDecoder {	//アセンブラ版から参照するのでレイアウト固定です。
	const unsigned char*	blk;		//+ 0,4 現在のブロック
	      unsigned short	ofs;		//+ 4,2 現在のブロック内の走査位置オフセット	0〜65535
	      unsigned char	lev;		//+ 6,1 スタックレベル				0〜9
	      unsigned char	stk[9];		//+ 7,9 スタック				ペアを展開する時に、ペアの上位8bitをスタックに積む。スタックを増やすと圧縮率が向上するが、実験した所これ以上増やしても違いが少ない。
} ST_BytePairEncodingDecoder;			//=16
/*--------------------------------------------------------------------------*/
//全体を一度で展開する関数
int BytePairEncodingDecoder_Decode(const void* _src, void* _dst, int dstCap);
//１バイトづつ展開する関数(展開ストリーム)
void BytePairEncodingDecoder_Init(ST_BytePairEncodingDecoder* pDecoder, const void* _src);
int BytePairEncodingDecoder_Getc(ST_BytePairEncodingDecoder* pDecoder);

#endif//__CLIP_BPE_H__
