#ifndef _ttpalloc_h
#define _ttpalloc_h

// Reservierung von Speicher mit new und malloc()
#include <print>

// Templates zur Reservierung von Speicher.
// Hinweis: Die Templates sind jetzt vom Typ struct da
// alle Memberfunktionen public sind
// 1. Speicherreservierung mittels new
template <typename T>
struct NewAlloc
{
    static T* Create()
    {
        T* ptr = new T;
        std::println("NewAlloc::Create(#{})",static_cast<void*>(ptr));
        return ptr;
    }
    static void Release(T *ptr)
    {
        std::println("NewAlloc::Release(#{})",static_cast<void*>(ptr));
        delete ptr;
    }
};
// 2. Speicherreservierung mittels malloc
// In der Praxis könnte z.B anstelle von malloc() die
// Reservierung von Speicher in einem bestimmten Bereich
// (z.B. shared-Memory) erfolgen
template <typename T>
struct MallocAlloc
{
    static T* Create()
    {
        void *pMem = std::malloc(sizeof(T));
        // Wenn mit malloc Speicher fuer Objekte reserviert
        // wird, so muss der ctor des Objekts explizit mit
        // dem placement-new Operator aufgerufen werden
        std::println("MallocAlloc::Create(#{})",pMem);
        if (pMem != NULL)
           return new(pMem) T;
        return NULL;
    }
    static void Release(T* ptr)
    {
        std::println("MallocAlloc::Release(#{})",static_cast<void*>(ptr));
        // Explizter Aufruf des dtors erforderlich!
        ptr->~T();
        free(ptr);
    }
};
#endif
