class.h
3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* \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 <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::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: