class.h 3.19 KB
/**
 * \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 © 2012-2013 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 <http://www.gnu.org/licenses/>.
 */

#ifndef __TR_CLASS_INTERFACE_CLASS_H__
#define __TR_CLASS_INTERFACE_CLASS_H__

#include <stdarg.h>

#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::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_classNewParams(_##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: