Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWDiskPageHeap

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

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 から継承した関数。