You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.2 KiB
121 lines
3.2 KiB
/**
|
|
* \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_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:
|