\hypertarget{class_8h}{ \section{include/class.h File Reference} \label{class_8h}\index{include/class.h@{include/class.h}} } {\ttfamily \#include $<$stdarg.h$>$}\par {\ttfamily \#include $<$sys/types.h$>$}\par {\ttfamily \#include $<$string.h$>$}\par {\ttfamily \#include $<$assert.h$>$}\par {\ttfamily \#include \char`\"{}interface.h\char`\"{}}\par Include dependency graph for class.h: This graph shows which files directly or indirectly include this file: \subsection*{Classes} \begin{DoxyCompactItemize} \item struct \hyperlink{structclass}{class} \end{DoxyCompactItemize} \subsection*{Defines} \begin{DoxyCompactItemize} \item \#define \hyperlink{class_8h_a04ec2c53aa9fcdb5b58dc8e9d552dec0}{\_\-ISOC99\_\-SOURCE} \item \#define \hyperlink{class_8h_a28c4c4c1ebf62795262a3553d59e8bff}{CLASS\_\-MAGIC}~0xFEFE \item \#define \hyperlink{class_8h_ab12c2142e0ec3f4f19a03b3879c67f32}{CLASS}(name) \item \#define \hyperlink{class_8h_a45e588b871b5b73461805ab4a5c59aa5}{EXTENDS}(parent)~const char \_\-\mbox{[}sizeof(struct c\_\-\#\#parent)\mbox{]} \item \#define \hyperlink{class_8h_ab9f9098d95379c04d979721396dabf68}{\_\-NULL}~NULL \item \#define \hyperlink{class_8h_a509b4880afb25bb862c448d7a71e7afe}{CREATE\_\-CLASS}(name, \_\-parent,...) \item \#define \hyperlink{class_8h_a2e9a0b177e4115cc7e547b51ac35c5af}{\_\-CALL}(object, \_\-iface, method,...) \item \#define \hyperlink{class_8h_ada752d9d1fdbf84e978606e8999c762d}{CALL}(object, \_\-iface, method,...) \item \#define \hyperlink{class_8h_a06fb0f2e08d1cbacbed6784319e7c3fc}{RETCALL}(object, \_\-iface, method, ret,...) \item \#define \hyperlink{class_8h_adb99542d8748b5108322ccb26bb367e0}{IFACE\_\-GET}(\hyperlink{structclass}{class}, iface)~(interfaceGet(\&((\hyperlink{structclass}{class})-\/$>$impl),(iface))) \item \#define \hyperlink{class_8h_a80e924aca338b869530dde0a9389e916}{IFACE\_\-EXISTS}(\hyperlink{structclass}{class}, iface)~(NULL != IFACE\_\-GET((\hyperlink{structclass}{class}),(iface))) \item \#define \hyperlink{class_8h_a5ea9893a0e62748b9d1154d5b77abed1}{HAS\_\-PARENT}(\hyperlink{structclass}{class})~(NULL != ((\hyperlink{structclass}{class})-\/$>$parent)) \end{DoxyCompactItemize} \subsection*{Typedefs} \begin{DoxyCompactItemize} \item typedef void($\ast$ \hyperlink{class_8h_aa0ba47bce818b20155a8ef17a1fdc35c}{fptr\_\-classInit} )(void) \item typedef struct \hyperlink{structclass}{class} $\ast$ \hyperlink{class_8h_a68df9f6e346c5fad9f61bb2557d1d832}{class\_\-ptr} \end{DoxyCompactItemize} \subsection*{Functions} \begin{DoxyCompactItemize} \item void $\ast$ \hyperlink{class_8h_ad96186de45579eb423ab318a5caaf62f}{class\_\-getInterface} (\hyperlink{structclass}{class\_\-ptr} $\ast$, \hyperlink{structinterface}{iface\_\-ptr}) \item \hyperlink{structclass}{class\_\-ptr} \hyperlink{class_8h_a1f382a42de272d5cc4d6bb5b17db6ede}{class\_\-getClass} (void $\ast$) \end{DoxyCompactItemize} \subsection{Define Documentation} \hypertarget{class_8h_a2e9a0b177e4115cc7e547b51ac35c5af}{ \index{class.h@{class.h}!\_\-CALL@{\_\-CALL}} \index{\_\-CALL@{\_\-CALL}!class.h@{class.h}} \subsubsection[{\_\-CALL}]{\setlength{\rightskip}{0pt plus 5cm}\#define \_\-CALL( \begin{DoxyParamCaption} \item[{}]{object, } \item[{}]{\_\-iface, } \item[{}]{method, } \item[{}]{...} \end{DoxyParamCaption} )}} \label{class_8h_a2e9a0b177e4115cc7e547b51ac35c5af} {\bfseries Value:} \begin{DoxyCode} class_ptr class = class_getClass((object)); \ struct i_##_iface * iface; \ if (class->init) class->init(); \ iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ class = class->parent; \ if (class->init) class->init(); \ iface = (struct i_##_iface *)class_getInterface(&class, &i_##_ifa ce); \ }; \ assert(NULL != iface->method); \end{DoxyCode} : actually i use gcc feature \#\# for variadoc... think about a way to make this standard. Definition at line 43 of file class.h. \hypertarget{class_8h_a04ec2c53aa9fcdb5b58dc8e9d552dec0}{ \index{class.h@{class.h}!\_\-ISOC99\_\-SOURCE@{\_\-ISOC99\_\-SOURCE}} \index{\_\-ISOC99\_\-SOURCE@{\_\-ISOC99\_\-SOURCE}!class.h@{class.h}} \subsubsection[{\_\-ISOC99\_\-SOURCE}]{\setlength{\rightskip}{0pt plus 5cm}\#define \_\-ISOC99\_\-SOURCE}} \label{class_8h_a04ec2c53aa9fcdb5b58dc8e9d552dec0} Definition at line 11 of file class.h. \hypertarget{class_8h_ab9f9098d95379c04d979721396dabf68}{ \index{class.h@{class.h}!\_\-NULL@{\_\-NULL}} \index{\_\-NULL@{\_\-NULL}!class.h@{class.h}} \subsubsection[{\_\-NULL}]{\setlength{\rightskip}{0pt plus 5cm}\#define \_\-NULL~NULL}} \label{class_8h_ab9f9098d95379c04d979721396dabf68} Definition at line 24 of file class.h. \hypertarget{class_8h_ada752d9d1fdbf84e978606e8999c762d}{ \index{class.h@{class.h}!CALL@{CALL}} \index{CALL@{CALL}!class.h@{class.h}} \subsubsection[{CALL}]{\setlength{\rightskip}{0pt plus 5cm}\#define CALL( \begin{DoxyParamCaption} \item[{}]{object, } \item[{}]{\_\-iface, } \item[{}]{method, } \item[{}]{...} \end{DoxyParamCaption} )}} \label{class_8h_ada752d9d1fdbf84e978606e8999c762d} {\bfseries Value:} \begin{DoxyCode} do { \ _CALL(object, _iface, method, ##__VA_ARGS__); \ iface->method(object, ##__VA_ARGS__); \ } while(0) \end{DoxyCode} Definition at line 55 of file class.h. \hypertarget{class_8h_ab12c2142e0ec3f4f19a03b3879c67f32}{ \index{class.h@{class.h}!CLASS@{CLASS}} \index{CLASS@{CLASS}!class.h@{class.h}} \subsubsection[{CLASS}]{\setlength{\rightskip}{0pt plus 5cm}\#define CLASS( \begin{DoxyParamCaption} \item[{}]{name} \end{DoxyParamCaption} )}} \label{class_8h_ab12c2142e0ec3f4f19a03b3879c67f32} {\bfseries Value:} \begin{DoxyCode} struct c_##name; \ typedef struct c_##name * name; \ extern struct class * const _##name; \ struct c_##name \end{DoxyCode} Definition at line 15 of file class.h. \hypertarget{class_8h_a28c4c4c1ebf62795262a3553d59e8bff}{ \index{class.h@{class.h}!CLASS\_\-MAGIC@{CLASS\_\-MAGIC}} \index{CLASS\_\-MAGIC@{CLASS\_\-MAGIC}!class.h@{class.h}} \subsubsection[{CLASS\_\-MAGIC}]{\setlength{\rightskip}{0pt plus 5cm}\#define CLASS\_\-MAGIC~0xFEFE}} \label{class_8h_a28c4c4c1ebf62795262a3553d59e8bff} Definition at line 13 of file class.h. \hypertarget{class_8h_a509b4880afb25bb862c448d7a71e7afe}{ \index{class.h@{class.h}!CREATE\_\-CLASS@{CREATE\_\-CLASS}} \index{CREATE\_\-CLASS@{CREATE\_\-CLASS}!class.h@{class.h}} \subsubsection[{CREATE\_\-CLASS}]{\setlength{\rightskip}{0pt plus 5cm}\#define CREATE\_\-CLASS( \begin{DoxyParamCaption} \item[{}]{name, } \item[{}]{\_\-parent, } \item[{}]{...} \end{DoxyParamCaption} )}} \label{class_8h_a509b4880afb25bb862c448d7a71e7afe} {\bfseries Value:} \begin{DoxyCode} static struct class c_##name; \ static void _classInit_(void) { \ c_##name.parent = _##_parent; \ c_##name.init = NULL; \ } \ static struct class c_##name = { \ CLASS_MAGIC, \ NULL, \ sizeof(struct c_##name), \ _classInit_, \ INIT_IMPL(__VA_ARGS__) \ }; struct class * const _##name = &c_##name \end{DoxyCode} Definition at line 25 of file class.h. \hypertarget{class_8h_a45e588b871b5b73461805ab4a5c59aa5}{ \index{class.h@{class.h}!EXTENDS@{EXTENDS}} \index{EXTENDS@{EXTENDS}!class.h@{class.h}} \subsubsection[{EXTENDS}]{\setlength{\rightskip}{0pt plus 5cm}\#define EXTENDS( \begin{DoxyParamCaption} \item[{}]{parent} \end{DoxyParamCaption} )~const char \_\-\mbox{[}sizeof(struct c\_\-\#\#parent)\mbox{]}}} \label{class_8h_a45e588b871b5b73461805ab4a5c59aa5} Definition at line 21 of file class.h. \hypertarget{class_8h_a5ea9893a0e62748b9d1154d5b77abed1}{ \index{class.h@{class.h}!HAS\_\-PARENT@{HAS\_\-PARENT}} \index{HAS\_\-PARENT@{HAS\_\-PARENT}!class.h@{class.h}} \subsubsection[{HAS\_\-PARENT}]{\setlength{\rightskip}{0pt plus 5cm}\#define HAS\_\-PARENT( \begin{DoxyParamCaption} \item[{}]{{\bf class}} \end{DoxyParamCaption} )~(NULL != (({\bf class})-\/$>$parent))}} \label{class_8h_a5ea9893a0e62748b9d1154d5b77abed1} Definition at line 71 of file class.h. \hypertarget{class_8h_a80e924aca338b869530dde0a9389e916}{ \index{class.h@{class.h}!IFACE\_\-EXISTS@{IFACE\_\-EXISTS}} \index{IFACE\_\-EXISTS@{IFACE\_\-EXISTS}!class.h@{class.h}} \subsubsection[{IFACE\_\-EXISTS}]{\setlength{\rightskip}{0pt plus 5cm}\#define IFACE\_\-EXISTS( \begin{DoxyParamCaption} \item[{}]{{\bf class}, } \item[{}]{iface} \end{DoxyParamCaption} )~(NULL != IFACE\_\-GET(({\bf class}),(iface)))}} \label{class_8h_a80e924aca338b869530dde0a9389e916} Definition at line 69 of file class.h. \hypertarget{class_8h_adb99542d8748b5108322ccb26bb367e0}{ \index{class.h@{class.h}!IFACE\_\-GET@{IFACE\_\-GET}} \index{IFACE\_\-GET@{IFACE\_\-GET}!class.h@{class.h}} \subsubsection[{IFACE\_\-GET}]{\setlength{\rightskip}{0pt plus 5cm}\#define IFACE\_\-GET( \begin{DoxyParamCaption} \item[{}]{{\bf class}, } \item[{}]{iface} \end{DoxyParamCaption} )~(interfaceGet(\&(({\bf class})-\/$>$impl),(iface)))}} \label{class_8h_adb99542d8748b5108322ccb26bb367e0} Definition at line 68 of file class.h. \hypertarget{class_8h_a06fb0f2e08d1cbacbed6784319e7c3fc}{ \index{class.h@{class.h}!RETCALL@{RETCALL}} \index{RETCALL@{RETCALL}!class.h@{class.h}} \subsubsection[{RETCALL}]{\setlength{\rightskip}{0pt plus 5cm}\#define RETCALL( \begin{DoxyParamCaption} \item[{}]{object, } \item[{}]{\_\-iface, } \item[{}]{method, } \item[{}]{ret, } \item[{}]{...} \end{DoxyParamCaption} )}} \label{class_8h_a06fb0f2e08d1cbacbed6784319e7c3fc} {\bfseries Value:} \begin{DoxyCode} do { \ _CALL(object, _iface, method, ##__VA_ARGS__); \ ret = iface->method(object, ##__VA_ARGS__); \ } while(0) \end{DoxyCode} Definition at line 61 of file class.h. \subsection{Typedef Documentation} \hypertarget{class_8h_a68df9f6e346c5fad9f61bb2557d1d832}{ \index{class.h@{class.h}!class\_\-ptr@{class\_\-ptr}} \index{class\_\-ptr@{class\_\-ptr}!class.h@{class.h}} \subsubsection[{class\_\-ptr}]{\setlength{\rightskip}{0pt plus 5cm}typedef struct {\bf class}$\ast$ {\bf class\_\-ptr}}} \label{class_8h_a68df9f6e346c5fad9f61bb2557d1d832} Definition at line 76 of file class.h. \hypertarget{class_8h_aa0ba47bce818b20155a8ef17a1fdc35c}{ \index{class.h@{class.h}!fptr\_\-classInit@{fptr\_\-classInit}} \index{fptr\_\-classInit@{fptr\_\-classInit}!class.h@{class.h}} \subsubsection[{fptr\_\-classInit}]{\setlength{\rightskip}{0pt plus 5cm}typedef void($\ast$ {\bf fptr\_\-classInit})(void)}} \label{class_8h_aa0ba47bce818b20155a8ef17a1fdc35c} Definition at line 73 of file class.h. \subsection{Function Documentation} \hypertarget{class_8h_a1f382a42de272d5cc4d6bb5b17db6ede}{ \index{class.h@{class.h}!class\_\-getClass@{class\_\-getClass}} \index{class\_\-getClass@{class\_\-getClass}!class.h@{class.h}} \subsubsection[{class\_\-getClass}]{\setlength{\rightskip}{0pt plus 5cm}{\bf class\_\-ptr} class\_\-getClass ( \begin{DoxyParamCaption} \item[{void $\ast$}]{} \end{DoxyParamCaption} )}} \label{class_8h_a1f382a42de272d5cc4d6bb5b17db6ede} Definition at line 21 of file class.c. \begin{DoxyCode} { return *(class_ptr *)(object - sizeof(void*)); } \end{DoxyCode} Here is the caller graph for this function: \hypertarget{class_8h_ad96186de45579eb423ab318a5caaf62f}{ \index{class.h@{class.h}!class\_\-getInterface@{class\_\-getInterface}} \index{class\_\-getInterface@{class\_\-getInterface}!class.h@{class.h}} \subsubsection[{class\_\-getInterface}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ class\_\-getInterface ( \begin{DoxyParamCaption} \item[{{\bf class\_\-ptr} $\ast$}]{, } \item[{{\bf iface\_\-ptr}}]{} \end{DoxyParamCaption} )}} \label{class_8h_ad96186de45579eb423ab318a5caaf62f} Definition at line 8 of file class.c. \begin{DoxyCode} { void * iface = (void *)IFACE_GET(*class, _iface); while(NULL == iface && HAS_PARENT(*class)) { *class = (*class)->parent; iface = (void *)IFACE_GET(*class, _iface); } return iface; } \end{DoxyCode}