new() and (usually) free()
new() chips off a piece of storage of the proper size
from the heap
free() return a piece of storage back to the heap
new() and free() calls may occur in any order
new()) and insert (free()) new entries anywhere
in the list
struct header {
char * block;
unsigned size;
};
typedef listHeap; Heap hp;
new(size)
Heap::iterator i; for (i = hp.begin(); i != hp.end(); i++) if ((*i).size >= size) break;
if (i == hp.end()) return 0; char * b = (*i).block; (*i).block += size; (*i).size -= size;
if ((*i).size == 0) hp.erase(i);
free(b)
Heap::iterator i; for (i = hp.begin(); i != hp.end(); i++) if (b.block < (*i).block) break; i = hp.insert(i, b);
if (i != hp.begin()) {
Heap::iterator previous = i;
previous--;
if ((*previous).block + (*previous).size == (*i).block) {
(*previous).size += (*i).size;
hp.erase(i);
i = previous;
}
}
Heap::iterator next = i;
next++;
if (next != hp.end())
if ((*i).block + (*i).size == (*next).block) {
(*i).size += (*next).size;
hp.erase(next);
}
template <typename T>
class sparse_matrix {
private:
template <typename CellT>
struct Cell {
int coord;
CellT value;
};
typedef list<Cell<T> > column;
typedef list<Cell<column> > columns;
columns sm;
};
sparse_matrix(T & default);
This page last modified on 11 July 2000.