バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWDiskPageHeap

RWDiskPageHeap RWBufferedPageHeap RWVirtualPageHeap

形式

#include <rw/diskpage.h>
unsigned nbufs;
unsigned pagesize;
RWDiskPageHeap heap("filename", nbufs, pagesize) ;

説明

このクラスは、バッファページヒープの特殊化タイプです。必要に応じて、ページをディスクにスワップします。

持続性

なし

以下の例は、リンクドリストの 100 個のノードを作成し、要素を互いにリンクしています。次に、リンクリストの要素を検査して、100 個のノードがあるかどうかを調べています。1 ページに 1 ノードですから、次のノードへの「ポインタ」は、実際には次のページのハンドルと同じです。

#include <rw/diskpage.h>
#include <rw/rstream.h>

struct Node {
  int   key;
  RWHandle  next;
};

RWHandle head = 0;

const int N = 100;  // 100 ノードを実行する

main() {

  // ページサイズがノードサイズと等しく、バッファが 10 個の
  // ディスクベースのページヒープを作成する
  RWDiskPageHeap heap(0, 10, sizeof(Node));
  // リンクリストを作成する
  for (int i=0; i<N; i++){
    RWHandle h = heap.allocate();
    Node* newNode = (Node*)heap.lock(h);
    newNode->key  = i;
    newNode->next = head;
    head = h;
    heap.dirty(h);
    heap.unlock(h);
  }

  // リスト内を検査する
  unsigned count = 0;
  RWHandle nodeHandle = head;
  while(nodeHandle){
    Node* node = (Node*)heap.lock(nodeHandle);

    RWHandle nextHandle = node->next;
    heap.unlock(nodeHandle);
    heap.deallocate(nodeHandle);
    nodeHandle = nextHandle;
    count++;
  }

  cout << "List with " << count << " nodes walked.\n";
  return 0;
}

プログラム出力:

List with 100 nodes walked.

公開コンストラクタ

RWDiskPageHeap(const char* filename = 0,
               unsigned nbufs       = 10,
               unsigned pgsize      = 512);

ディスクベースのページヒープを新しく作成します。このとき、filename というファイル名を使用するか、あるいはオペレーティングシステムに依頼して自動的に一時ファイル名を使用します。バッファ数は nbufs となります。これ以上のページは、一度にロックできません。各バッファの大きさはページサイズになり、各ページのサイズは pgsize で指定します。正しく RWDiskPageHeap が作成されたかどうかを見るには、メンバー関数 isValid() を呼び出します。

公開デストラクタ

virtual
~RWDiskPageHeap();

ディスクページヒープが使用したすべての資源をオペレーティングシステムに返します。デストラクタを呼び出す前に、すべてのページ割り当てを解放しなければなりません。

公開メンバー関数

virtual RWHandle
allocate();

クラス RWVirtualPageHeap から再定義した関数。ディスクページヒープから 1 ページを割り当て、そのハンドルを返します。領域がない、たとえばディスクがいっぱいのときはゼロを返します。

virtual void
deallocate(RWHandle h);

クラス RWBufferedPageHeap から再定義した関数。ハンドル h のページ割り当てを解放します。ゼロのハンドルの割り当てを解放しても、エラーにはなりません。

virtual void
dirty(RWHandle h);

クラス RWBufferedPageHeap から継承した関数。

RWBoolean
isValid() const;

正しい RWDiskPageHeap なら、TRUE を返します。

virtual void*
lock(RWHandle h);

クラス RWBufferedPageHeap から継承した関数。

virtual void
unlock(RWHandle h);

クラス RWBufferedPageHeap から継承した関数。