バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWBTreeOnDisk
typedef long RWstoredValue ;
typedef int (*RWdiskTreeCompare)(const char*, const char*,
size_t);
#include <rw/disktree.h>
#include <rw/filemgr.h>
RWFileManager fm("filename.dat");
RWBTreeOnDisk bt(fm);
このクラスは、ディスクファイル上で B ツリーを管理するために設計されています。文字配列として定義されているキーと typedef RWstoredValue で定義されている値を、B ツリーに格納したり取り出したりします。値は、ファイル内のオブジェクトが格納されている場所へのオフセットを表すことができます。キー長はコンストラクタで設定します。デフォルトは 16 バイトです。
デフォルトでは、キーはヌル文字で終わります。ただしツリーでは文字列中のヌル文字を利用できるため、結果として複数バイトやバイナリのデータをキーとして使用することができます。その際、次の点を守る必要があります。
このクラスは、ディスクファイル領域の割り当ておよび解放を管理するクラス RWFileManager と一緒に使用するように設計されています。
このクラスを作成する際は、コンストラクタ内におけるルートノードの位置を引数 start として指定します。この値が RWNIL (デフォルト) である場合、その位置は、関数 start() を使用して RWFileManager から取り出されます (RWFileManager を参照してください)。また列挙型 createMode を使用して、既存のツリーを使用するのか新しくツリーを作成するのかを設定することができます。その結果、ルートノードの位置はメンバー関数 rootLocation() を使用して取り出すことができます。
1 つのディスクファイルに複数の B ツリーを置くことができます。各ツリーには独自のルートノードが必要です。各 B ツリーにルートノードを与えるには、B ツリーの数だけRWBTreeOnDisk を作成する際に createMode をそれぞれ create に設定します。
B ツリーの order もコンストラクタ内に設定できます。大きな値を使用するとツリーは浅くなりますが、ディスク領域の使用効率は悪くなります。1 つのノードにおけるエントリの最小数も設定することができます。小さな値を使用するとツリーのバランスを早く整えることができますが、ディスク領域の使用効率は悪くなります。
enum styleMode {V6Style, V5Style};
enum createMode {autoCreate, create};
RWBTreeOnDisk(RWFileManager& f,
unsigned nbuf = 10,
createMode omode = autoCreate,
unsigned keylen = 16,
RWBoolean ignoreNull = FALSE,
RWoffset start = RWNIL,
styleMode smode = V6Style,
unsigned halfOrder = 10,
unsigned minFill = 10);
void applyToKeyAndValue((*ap)(const char*,RWstoredValue), void* x);
void yourApplyFunction(const char* ky,
RWstoredValue val,void* x);
RWoffset baseLocation() const;
unsigned cacheCount() const;
unsigned cacheCount(unsigned newcount);
void clear();
RWBoolean contains(const char* ky) const;
size_t entries();
RWoffset extraLocation(RWoffset newlocation);
RWBoolean findKey( const char* ky, RWCString& foundKy)const ;
RWBoolean
findKeyAndValue( const char* ky,
RWCString& foundKy,
RWStoredValue& foundVal)const ;
RWstoredValue findValue(const char* ky)const;
int height();
int insertKeyAndValue(const char* ky,RWstoredValue v);
unsigned keyLength() const;
unsigned minOrder()const;
unsigned nodeSize() const;
unsigned order()const;
RWBoolean isEmpty() const;
void remove(const char* ky);
RWBoolean
replaceValue(const RWCString& key,
const RWstoredValue newval,
RWstoredValue& oldVal);
RWdiskTreeCompare setComparison(RWdiskTreeCompare fun);
int yourFun(const char* key1, const char* key2, size_t N);
