MythTV  0.26-pre
dllist.h
Go to the documentation of this file.
00001 #ifndef DLLIST_H
00002 #define DLLIST_H
00003 
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007 
00008 struct dl_node
00009 {
00010     struct dl_node *next;
00011     struct dl_node *prev;
00012 };
00013 
00014 struct dl_head
00015 {
00016     struct dl_node *first;
00017     struct dl_node *null;
00018     struct dl_node *last;
00019 };
00020 
00021 static inline struct dl_head *
00022 dl_init(struct dl_head *h)
00023 {
00024     h->first = (struct dl_node *)&h->null;
00025     h->null = 0;
00026     h->last = (struct dl_node *)&h->first;
00027     return h;
00028 }
00029 
00030 static inline struct dl_node *
00031 dl_remove(struct dl_node *n)
00032 {
00033     n->prev->next = n->next;
00034     n->next->prev = n->prev;
00035     return n;
00036 }
00037 
00038 static inline struct dl_node *
00039 dl_insert_after(struct dl_node *p, struct dl_node *n)
00040 {
00041     n->next = p->next;
00042     n->prev = p;
00043     p->next = n;
00044     n->next->prev = n;
00045     return n;
00046 }
00047 
00048 #define dl_empty(h)             ((h)->first->next == 0)
00049 #define dl_insert_before(p, n)  dl_insert_after((p)->prev, (n))
00050 #define dl_insert_first(h, n)   ({ struct dl_node *_n = (n); \
00051                                        dl_insert_before((h)->first, _n); })
00052 #define dl_insert_last(h, n)    ({ struct dl_node *_n = (n); \
00053                                        dl_insert_after((h)->last, _n); })
00054 #define dl_remove_first(h)      dl_remove((h)->first) // mustn't be empty!
00055 #define dl_remove_last(h)       dl_remove((h)->last) // mustn't be empty!
00056 
00057 #ifdef __cplusplus
00058 }
00059 #endif
00060 
00061 #endif /* DLLIST_H */
00062 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends