root/headers/private/kernel/util/Constructor.h
#ifndef _CONSTRUCTOR_H_
#define _CONSTRUCTOR_H_

#include <util/kernel_cpp.h>

template <class DataType>
class Constructor {
public:
        typedef DataType* Pointer;
        typedef const DataType* ConstPointer;
        typedef DataType& Reference;
        typedef const DataType& ConstReference;

        /*! Constructs the object pointed to by \a object via a
                zero-parameter constructor.
        */
        inline
        void Construct(Pointer object) {
                if (object)
                        new(reinterpret_cast<void*>(object)) DataType();
        }

        /*! Constructs the object pointed to by \a object via a
                one-parameter constructor using the given argument.
        */
        template <typename ArgType1>
        inline
        void Construct(Pointer object, ArgType1 arg1) {
                if (object)
                        new(reinterpret_cast<void*>(object)) DataType(arg1);
        }

        /*! Constructs the object pointed to by \a object via a
                two-parameter constructor using the given arguments.
        */
        template <typename ArgType1, typename ArgType2>
        inline
        void Construct(Pointer object, ArgType1 arg1, ArgType2 arg2) {
                if (object)
                        new(reinterpret_cast<void*>(object)) DataType(arg1, arg2);
        }

        /*! Constructs the object pointed to by \a object via a
                three-parameter constructor using the given arguments.
        */
        template <typename ArgType1, typename ArgType2, typename ArgType3>
        inline
        void Construct(Pointer object, ArgType1 arg1, ArgType2 arg2, ArgType3 arg3) {
                if (object)
                        new(reinterpret_cast<void*>(object)) DataType(arg1, arg2, arg3);
        }

        /*! Constructs the object pointed to by \a object via a
                four-parameter constructor using the given arguments.
        */
        template <typename ArgType1, typename ArgType2, typename ArgType3,
                  typename ArgType4>
        inline
        void Construct(Pointer object, ArgType1 arg1, ArgType2 arg2, ArgType3 arg3,
                       ArgType4 arg4) {
                if (object)
                        new(reinterpret_cast<void*>(object)) DataType(arg1, arg2, arg3, arg4);
        }

        /*! Calls the destructor for the object pointed to be \a object.
        */
        inline
        void Destruct(Pointer object) {
                if (object)
                        object->~DataType();
        }


};

#endif  // _CONSTRUCTOR_H_