Commit 95c0d00944f64ab78e767f08cd1c0cc2c56b1e92

Authored by Georg Hopp
1 parent 6591c0a6

get rid of some function calls when selection interfaces

@@ -6,7 +6,7 @@ AC_INIT([cclass], [0.0.1], [Georg Hopp <georg@steffers.org>]) @@ -6,7 +6,7 @@ AC_INIT([cclass], [0.0.1], [Georg Hopp <georg@steffers.org>])
6 AM_INIT_AUTOMAKE 6 AM_INIT_AUTOMAKE
7 AC_COPYRIGHT([Copyright (C) 2012 Georg Hopp]) 7 AC_COPYRIGHT([Copyright (C) 2012 Georg Hopp])
8 AC_REVISION([$Revision: 0.01 $]) 8 AC_REVISION([$Revision: 0.01 $])
9 -AC_CONFIG_SRCDIR([src/class.c]) 9 +AC_CONFIG_SRCDIR([src/testserver.c])
10 AC_CONFIG_HEADERS([config.h]) 10 AC_CONFIG_HEADERS([config.h])
11 AC_CONFIG_MACRO_DIR([m4]) 11 AC_CONFIG_MACRO_DIR([m4])
12 12
@@ -64,19 +64,23 @@ @@ -64,19 +64,23 @@
64 INIT_IMPL(__VA_ARGS__) \ 64 INIT_IMPL(__VA_ARGS__) \
65 }; struct class * const _##name = &c_##name 65 }; struct class * const _##name = &c_##name
66 66
  67 +#define GET_CLASS(object) (*(class_ptr *)((object) - sizeof(void*)))
  68 +#define IFACE_GET(class,iface) (interfaceGet(&((class)->impl),(iface)))
  69 +#define IFACE_EXISTS(class,iface) (NULL != IFACE_GET((class),(iface)))
  70 +
67 /** 71 /**
68 * \todo actually i use gcc feature ## for variadoc... think about 72 * \todo actually i use gcc feature ## for variadoc... think about
69 * a way to make this standard. 73 * a way to make this standard.
70 */ 74 */
71 #define _CALL(object,_iface,method,...) \ 75 #define _CALL(object,_iface,method,...) \
72 do { \ 76 do { \
73 - class_ptr class = class_getClass((object)); \ 77 + class_ptr class = GET_CLASS((object)); \
74 if (class->init) class->init(); \ 78 if (class->init) class->init(); \
75 - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ 79 + iface = (struct i_##_iface *)IFACE_GET(class, &i_##_iface); \
76 while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ 80 while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \
77 class = class->parent; \ 81 class = class->parent; \
78 if (class->init) class->init(); \ 82 if (class->init) class->init(); \
79 - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ 83 + iface = (struct i_##_iface *)IFACE_GET(class, &i_##_iface); \
80 }; \ 84 }; \
81 assert(NULL != iface->method); \ 85 assert(NULL != iface->method); \
82 } while(0) 86 } while(0)
@@ -98,20 +102,17 @@ @@ -98,20 +102,17 @@
98 #define PARENTCALL(object,_iface,method,...) \ 102 #define PARENTCALL(object,_iface,method,...) \
99 do { \ 103 do { \
100 struct i_##_iface * iface; \ 104 struct i_##_iface * iface; \
101 - class_ptr class = class_getClass((object)); \ 105 + class_ptr class = GET_CLASS((object)); \
102 if (class->init) class->init(); \ 106 if (class->init) class->init(); \
103 assert(HAS_PARENT(class)); \ 107 assert(HAS_PARENT(class)); \
104 class = class->parent; \ 108 class = class->parent; \
105 if (class->init) class->init(); \ 109 if (class->init) class->init(); \
106 - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ 110 + iface = (struct i_##_iface *)IFACE_GET(class, &i_##_iface); \
107 assert(NULL != iface->method); \ 111 assert(NULL != iface->method); \
108 iface->method(object, ##__VA_ARGS__); \ 112 iface->method(object, ##__VA_ARGS__); \
109 } while(0) 113 } while(0)
110 114
111 115
112 -#define IFACE_GET(class,iface) (interfaceGet(&((class)->impl),(iface)))  
113 -#define IFACE_EXISTS(class,iface) (NULL != IFACE_GET((class),(iface)))  
114 -  
115 #define HAS_PARENT(class) (NULL != ((class)->parent)) 116 #define HAS_PARENT(class) (NULL != ((class)->parent))
116 117
117 typedef void (* fptr_classInit)(void); 118 typedef void (* fptr_classInit)(void);
@@ -126,9 +127,6 @@ struct class { @@ -126,9 +127,6 @@ struct class {
126 struct iface_impl impl; 127 struct iface_impl impl;
127 }; 128 };
128 129
129 -extern void * class_getInterface(class_ptr *, iface_ptr);  
130 -extern class_ptr class_getClass(void *);  
131 -  
132 #endif // __CLASS_H__ 130 #endif // __CLASS_H__
133 131
134 // vim: set ts=4 sw=4: 132 // vim: set ts=4 sw=4:
@@ -3,9 +3,7 @@ AUTOMAKE_OPTIONS = subdir-objects @@ -3,9 +3,7 @@ AUTOMAKE_OPTIONS = subdir-objects
3 3
4 IFACE = interface/class.c interface/stream_reader.c interface/logger.c \ 4 IFACE = interface/class.c interface/stream_reader.c interface/logger.c \
5 interface/stream_writer.c interface/http_intro.c \ 5 interface/stream_writer.c interface/http_intro.c \
6 - interface/subject.c interface/observer.c  
7 -CLASS = class.c interface.c  
8 -RB = ringbuffer.c ringbuffer/rb_read.c 6 + interface/subject.c interface/observer.c interface.c
9 SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c 7 SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c
10 SERVER = server.c server/run.c server/close_conn.c server/poll.c \ 8 SERVER = server.c server/run.c server/close_conn.c server/poll.c \
11 server/handle_accept.c server/read.c 9 server/handle_accept.c server/read.c
@@ -41,7 +39,7 @@ AM_CFLAGS = -Wall -I ../include/ @@ -41,7 +39,7 @@ AM_CFLAGS = -Wall -I ../include/
41 bin_PROGRAMS = testserver 39 bin_PROGRAMS = testserver
42 40
43 testserver_SOURCES = testserver.c \ 41 testserver_SOURCES = testserver.c \
44 - $(IFACE) $(CLASS) $(SOCKET) $(SERVER) $(LOGGER) $(MSG) $(REQ) \ 42 + $(IFACE) $(SOCKET) $(SERVER) $(LOGGER) $(MSG) $(REQ) \
45 $(WRITER) $(RESP) $(HEADER) $(PARSER) $(WORKER) $(CB) \ 43 $(WRITER) $(RESP) $(HEADER) $(PARSER) $(WORKER) $(CB) \
46 $(UTILS) 44 $(UTILS)
47 testserver_CFLAGS = -Wall -I ../include/ 45 testserver_CFLAGS = -Wall -I ../include/
1 -/**  
2 - * \file  
3 - * Helper functions for class.  
4 - *  
5 - * \todo rename function to fit in the otherwise used scheme.  
6 - * \author Georg Hopp  
7 - *  
8 - * \copyright  
9 - * Copyright (C) 2012 Georg Hopp  
10 - *  
11 - * This program is free software: you can redistribute it and/or modify  
12 - * it under the terms of the GNU General Public License as published by  
13 - * the Free Software Foundation, either version 3 of the License, or  
14 - * (at your option) any later version.  
15 - *  
16 - * This program is distributed in the hope that it will be useful,  
17 - * but WITHOUT ANY WARRANTY; without even the implied warranty of  
18 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
19 - * GNU General Public License for more details.  
20 - *  
21 - * You should have received a copy of the GNU General Public License  
22 - * along with this program. If not, see <http://www.gnu.org/licenses/>.  
23 - */  
24 -  
25 -#include <stdarg.h>  
26 -#include <stdlib.h>  
27 -  
28 -#include "class.h"  
29 -#include "interface.h"  
30 -  
31 -void *  
32 -class_getInterface(class_ptr * class, iface_ptr _iface)  
33 -{  
34 - void * iface = (void *)IFACE_GET(*class, _iface);  
35 -  
36 - while(NULL == iface && HAS_PARENT(*class)) {  
37 - *class = (*class)->parent;  
38 - iface = (void *)IFACE_GET(*class, _iface);  
39 - }  
40 -  
41 - return iface;  
42 -}  
43 -  
44 -class_ptr  
45 -class_getClass(void * object)  
46 -{  
47 - return *(class_ptr *)(object - sizeof(void*));  
48 -}  
49 -  
50 -// vim: set ts=4 sw=4:  
@@ -70,7 +70,7 @@ classDelete(void ** object) @@ -70,7 +70,7 @@ classDelete(void ** object)
70 void * 70 void *
71 classClone(void * _object) 71 classClone(void * _object)
72 { 72 {
73 - class_ptr class = class_getClass(_object); 73 + class_ptr class = GET_CLASS(_object);
74 void * object = calloc(1, class->object_size + sizeof(void*)); 74 void * object = calloc(1, class->object_size + sizeof(void*));
75 75
76 * (class_ptr *)object = class; 76 * (class_ptr *)object = class;
Please register or login to post a comment