#ifndef MEMORY_TRACKER_HEADER_INCLUDED
#define MEMORY_TRACKER_HEADER_INCLUDED

#include <cstddef>
#include <new>

extern long alloced;

template <typename T>
T* allocate(T * & p, size_t elems = 0)
{
    try
    {
        if ((p = elems > 1 ? new T[elems] : (elems=1,new T)) != nullptr)
        {
            alloced += sizeof(*p)*elems;
        }
    }
    catch (std::bad_alloc)
    {
        p = nullptr;
    }
    return p;
}

template <typename T>
void deallocate(T * & p, size_t elems = 0)
{
    if (elems > 1)
    {
        delete [] p;
    }
    else
    {
        elems = 1;
        delete p;
    }
    if (p != nullptr)
    {
        alloced -= sizeof(*p)*elems;
    }
    p = nullptr;
    return;
}

inline long report_usage(void)
{
    return alloced;
}

#endif
