#ifndef   __SPLAY_TREE__
#define   __SPLAY_TREE__

#include "utility.h"

typedef ctl_cmp_func ctl_spt_cmp;

pvoid ctl_sptree_initX(ppvoid sp, uint k_size, uint v_size, ctl_spt_cmp f);
pvoid ctl_sptree_freeX(ppvoid sp);

int  ctl_sptree_isEmptyX   (ppcvoid sp); 

uint ctl_sptree_getKeySizeX(ppcvoid sp);
uint ctl_sptree_getValSizeX(ppcvoid sp);

pvoid ctl_sptree_findX  (ppvoid sp, pcvoid key);
pvoid ctl_sptree_addX   (ppvoid sp, pcvoid key, pvoid val);
void  ctl_sptree_delX   (ppvoid sp, pcvoid key);
pvoid ctl_sptree_updateX(ppvoid sp, pcvoid key, pvoid val);

void  ctl_sptree_splitX(ppvoid sp, pcvoid key, ppvoid r, ppvoid l);
pvoid ctl_sptree_mergeX(ppvoid sp1, ppvoid sp2);

void ctl_sptree_clearX(ppvoid sp);
//void ctl_sptree_copyX (ppvoid sp, ppvoid sp2);

#define ctl_sptree_init(A,B,C,D) ctl_sptree_initX(ppVoid(A),B,C,(ctl_spt_cmp)D)
#define ctl_sptree_free(A)       ctl_sptree_freeX(ppVoid(A))

#define ctl_sptree_isEmpty(A)    ctl_sptree_isEmptyX   (ppcVoid(A))
#define ctl_sptree_getKeySize(A) ctl_sptree_getKeySizeX(ppcVoid(A))
#define ctl_sptree_getValSize(A) ctl_sptree_getValSizeX(ppcVoid(A))

#define ctl_sptree_find(A,B)     ctl_sptree_findX  (ppVoid(A),pcVoid(B))
#define ctl_sptree_add(A,B,C)    ctl_sptree_addX   (ppVoid(A),pcVoid(B),pVoid(C))
#define ctl_sptree_del(A,B)      ctl_sptree_delX   (ppVoid(A),pcVoid(B))
#define ctl_sptree_update(A,B,C) ctl_sptree_updateX(ppVoid(A),pcVoid(B),pvoid(C))

#define ctl_sptree_split(A,B,C,D) ctl_sptree_splitX(ppVoid(A),pcVoid(B),\
                                                    ppVoid(C),pcVoid(D))
#define ctl_sptree_merge(A,B)     ctl_sptree_mergeX(ppVoid(A),ppVoid(B))

#define ctl_sptree_clear(A)  ctl_sptree_clearX(ppVoid(A))
//#define ctl_sptree_copy(A,B) ctl_sptree_copyX (ppVoid(A),ppVoid(B))

#endif /* __SPLAY_TREE__ */