
//
// To jest przykładowy kod z podrozdziału 25.3.4 „Przykład użycia stosu” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <stddef.h> 

//------------------------------------------------------------------------------

template<int N>class Stack { // Stos N bajtów.
public:
    Stack();                 // Tworzy stos N bajtów.
    void* get(int n);        // Alokuje n bajtów na stosie.
                             // Zwraca 0, jeśli nie ma wolnego miejsca.
    void free();             // Zwraca na stos ostatnią wartość zwróconą przez get().
    int available() const;   // Liczba dostępnych bajtów.
private:
    // Przestrzeń dla char[N] i danych do śledzenia, co zostało alokowane,
    // a co nie (np. wskaźnik wskazujący wierzch stosu).
};

//------------------------------------------------------------------------------

class Port;
class Buffer;

//------------------------------------------------------------------------------

class Connection
{
public:
    Connection(Port* in, Port* out, int* buf);
    void* operator new(size_t size, void* place);
};

//------------------------------------------------------------------------------

extern Port* incoming;
extern Port* outgoing;

//------------------------------------------------------------------------------

int main()
{
    Stack<50*1024> my_free_store; // 50 KB pamięci zostało zarezerwowanych dla stosu.

    void* pv1 = my_free_store.get(1024);
    int* buffer = static_cast<int*>(pv1);  

    void* pv2 = my_free_store.get(sizeof(Connection));
    Connection* pconn = new(pv2) Connection(incoming,outgoing,buffer);
}

//------------------------------------------------------------------------------
