00001 /* vim: set sw=8 ts=8 sts=8 expandtab: */ 00002 #ifndef CMAID_CONTAINER_H 00003 #define CMAID_CONTAINER_H 00004 00020 #define CMAID_CONTAINER(c) ((Cmaid_Container *)(c)) 00021 00033 typedef int (*Cmaid_Container_Count_Cb)(const Cmaid_Container *c); 00035 typedef int (*Cmaid_Container_Empty_Is_Cb)(const Cmaid_Container *c); 00037 typedef void (*Cmaid_Container_Clear_Cb)(Cmaid_Container *c); 00039 typedef void (*Cmaid_Container_Iter_Attach_Cb)(Cmaid_Container *c, Cmaid_Iter *it); 00041 typedef void (*Cmaid_Container_Iter_Detach_Cb)(Cmaid_Container *c, Cmaid_Iter *it); 00043 typedef void (*Cmaid_Container_Destroy_Cb)(Cmaid_Container *c); 00045 typedef void (*Cmaid_Container_Node_Free_Cb)(Cmaid_Container *c, void *node); 00046 00052 #define CMAID_CONTAINER_INTERFACE(i) ((const Cmaid_Container_Interface *)(i)) 00053 00055 typedef struct Cmaid_Container_Interface Cmaid_Container_Interface; 00056 00061 struct Cmaid_Container_Interface 00062 { 00063 unsigned int magic; 00067 Cmaid_Container_Clear_Cb clear; 00069 Cmaid_Container_Iter_Attach_Cb iter_attach; 00071 Cmaid_Container_Iter_Detach_Cb iter_detach; 00073 Cmaid_Container_Destroy_Cb destroy; 00075 /* for internal use only */ 00076 Cmaid_Container_Node_Free_Cb node_free; 00083 }; 00097 struct Cmaid_Container 00098 { 00099 const Cmaid_Container_Interface *interface; 00101 int count; 00102 }; 00103 00104 CMAID_INLINE int cmaid_container_count(const Cmaid_Container *c); 00105 CMAID_INLINE int cmaid_container_empty_is(const Cmaid_Container *c); 00106 CMAID_INLINE void cmaid_container_clear(Cmaid_Container *c); 00107 CMAID_INLINE void cmaid_container_iter_attach(Cmaid_Container *c, 00108 Cmaid_Iter *it); 00109 CMAID_INLINE void cmaid_container_iter_detach(Cmaid_Container *c, 00110 Cmaid_Iter *it); 00111 CMAID_INLINE void cmaid_container_destroy(Cmaid_Container *c); 00112 00116 #include <cmaid_container_funcdef.h> 00117 #endif /* CMAID_CONTAINER_H */
1.5.8