Rogue Wave Software logo banner

Click on the banner to return to the Class Reference home page.

©Copyright 1996 Rogue Wave Software

RWDiskPageHeap


RWDiskPageHeapinherits fromRWBufferedPageHeapinherits fromRWVirtualPageHeap

Synopsis

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

Description

Class RWDiskPageHeap is a specializing type of buffered page heap. It swaps its pages to disk as necessary.

Persistence

None

Example

In this example, 100 nodes of a linked list are created and strung together. The list is then walked, confirming that it contains 100 nodes. Each node is a single page. The "pointer" to the next node is actually the handle for the next page.

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

struct Node {
  int key;
  RWHandle     next;
};

RWHandle head = 0;
const int N = 100;  // Exercise 100 Nodes

main() {
  // Construct a disk-based page heap with page size equal
  // to the size of Node and with 10 buffers:
  RWDiskPageHeap heap(0, 10, sizeof(Node));

  // Build the linked list:
  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);
  }

// Now walk the list:
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;
}
 

Program output:

List with 100 nodes walked.

Public Constructor

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

Public Destructor

virtual 
~RWDiskPageHeap();

Public Member Functions

virtual RWHandle
allocate();
virtual void
deallocate(RWHandle h);
virtual void
dirty(RWHandle h);
RWBoolean
isValid() const;
virtual void*
lock(RWHandle h);
virtual void
unlock(RWHandle h);