//======================================================================//
// NewDelete.cpp  -  show how to overload the new and delete operators  //
//======================================================================//


#include <iostream.h>
#include <stddef.h>        // for size_t


class Screen
{
  public:
    void *operator new (size_t size);
    void operator delete (void *p, size_t size);

  private:
    Screen *next;
    static Screen *freeStore;
    static const int screenChunk;
};


Screen *Screen::freeStore = NULL;
const int Screen::screenChunk = 24;        // or whatever size you want...


void *Screen::operator new (size_t size)
{
    register Screen *p;
    if (! freeStore)
    {
        // linked list is empty; grab a chunk
        // this call to 'new' is to the global 'new'
        size_t chunk = screenChunk * size;
        freeStore = p = (Screen *) new char [chunk];

        // now thread the screenChunk
        for ( ; p != &freeStore[screenChunk - 1]; p->next = p + 1, p++)
            ;
        p->next = NULL;
    }

    p = freeStore;
    freeStore = freeStore->next;
    return p;
}


void Screen::operator delete (void *p, size_t)
{
    // insert the 'deleted' object back into the free list
    ((Screen *) p)->next = freeStore;
    freeStore = (Screen *) p;
}


int main (void)
{
    cout << "Show how to overload the new and delete operators" << endl << endl;

    Screen *p[10];                  // a collection of screen pointers...

    for (int i = 0; i < 10; i++)
        p[i] = new Screen;          // the overloaded new is invoked here

    for (i = 0; i < 10; i++)
        delete p[i];                // the overloaded delete is invoked here

    return 0;
}

