\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}
