/** * \file * Interface for class handling. Defines new, delete and clone selectors * which in turn use the ctor, dtor and clone implementation from the * class implementation. * * \author Georg Hopp * * \copyright * Copyright © 2014 Georg Hopp * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __TR_CLASS_INTERFACE_CLASS_H__ #define __TR_CLASS_INTERFACE_CLASS_H__ #include #include "tr/class.h" #include "tr/interface.h" typedef int (* fptr_ctor)(void *, va_list *); typedef void (* fptr_dtor)(void *); typedef void (* fptr_clone)(void *, void * const); /** * The interface structure for the class interface. * Each class that implements this interface (and that * should be all classes) need to provide at least * a funtion pointer for the fptr_ctor. Else no * instances can be created. */ TR_INTERFACE(TR_Class) { TR_IFID; fptr_ctor ctor; fptr_dtor dtor; fptr_clone clone; }; /** * Interface caller function for i_class::ctor. * This one will never be called direcly but only through * TR_new. * * \see TR_classNewv * \see TR_new * * \cond PRIVATE */ void * TR_classNew(TR_class_ptr, ...); /** * This is another caller function for i_class:ctor but * this uses a va_list for the argument to the constructor * instead of an ellipse. * Again this will only be called through TR_newv. * * \see TR_newv */ void * TR_classNewv(TR_class_ptr, va_list *); /** * Interface caller function for i_class::ctor. * This is called when an instance of a class is created * with TR_INSTANCE (created on the stack). * Never called directly. * * \see TR_delete */ int TR_objectInit(void *, ...); /** * Interface caller function for i_class::dtor. * Never called directly. * * \see TR_delete */ void TR_classDelete(void **); /** * Interface caller function for i_class::clone * Never called directly. * * \see TR_delete */ void * TR_classClone(void *); /** \endcond */ /** * Create an instance of a class by calling its constructor * implementation after initialization and memory allocation * of the class itself. */ #define TR_new(class,...) TR_classNew(_##class, ##__VA_ARGS__) /** * Create an instance of a class by calling its constructor * implementation but this time with a va_list instead of a * variable amount of arguments. */ #define TR_newv(class,args) TR_classNewv(_##class, args) /** * Destroy an instance by first calling its destructor and then * free all other memory. */ #define TR_delete(object) TR_classDelete((void **)&(object)) /** * Create a clone of an instance by calling its clone implementation. * A simple memcopy is often not enough because the cloned instance * might have to allocate ist own resources or reuse resources in * a given way. */ #define TR_clone(object) TR_classClone((void *)(object)) #endif // __TR_CLASS_INTERFACE_CLASS_H__ // vim: set ts=4 sw=4: