Double-Chained List
[Chained lists]


Data Structures

struct  _dlist_node_t
struct  _dlist_t

Defines

#define _dnode_local_new(_n)   dlist_node_t _n = malloc(sizeof(struct _dlist_node_t))
#define dnode_del   free
#define dlist_insert_head_node(_l, _n)
#define dlist_insert_head(_l, _v)
#define dlist_insert_tail_node(_l, _n)
#define dlist_insert_tail(_l, _v)
#define dlist_remove_head(_l)
#define dlist_remove_head_no_free(_l)
#define dlist_remove_tail(_l)
#define dlist_remove_tail_no_free(_l)
#define dlist_remove(_l, _n)
#define dlist_remove_no_free(_l, _n)
#define dlist_forward(_l, _t, _f)
#define dlist_reverse(_l, _t, _f)
#define slist_insert_sorted(_l, _n, _cmp)
#define dlist_flush(_l)
#define debug(_n)   vm_printf("[%p]<- %p -> [%p]\n",(_n)->sched_data.prev,(_n),(_n)->sched_data.next)
#define dlist_insert_sorted(_l, _n, _cmp)

Typedefs

typedef struct
_dlist_node_t
dlist_node_t
typedef struct _dlist_tdlist_t

Functions

void dlist_init (dlist_t)
dlist_t dlist_new ()
void dlist_del (dlist_t)


Define Documentation

#define _dnode_local_new ( _n   )     dlist_node_t _n = malloc(sizeof(struct _dlist_node_t))

For internal use only.

#define dnode_del   free

For internal use only.

#define dlist_insert_head_node ( _l,
_n   ) 

Value:

do {\
                _n->next=(_l)->head;\
                _n->prev=NULL;\
                if((_l)->tail==NULL) {\
                        (_l)->tail=_n;\
                } else {\
                        (_l)->head->prev=_n;\
                }\
                (_l)->head=_n;\
        } while(0)

#define dlist_insert_head ( _l,
_v   ) 

Value:

do {\
                _dnode_local_new(n);\
                n->value=(word_t)(_v);\
                dlist_insert_head_node(_l,n);\
        } while(0)

#define dlist_insert_tail_node ( _l,
_n   ) 

Value:

do {\
                (_n)->next=NULL;\
                (_n)->prev=(_l)->tail;\
                if((_l)->head==NULL) {\
                        (_l)->head=(_n);\
                } else {\
                        (_l)->tail->next=(_n);\
                }\
                (_l)->tail=(_n);\
        } while(0)

#define dlist_insert_tail ( _l,
_v   ) 

Value:

do {\
                _dnode_local_new(n);\
                n->value=(word_t)(_v);\
                dlist_insert_tail_node(_l,n);\
        } while(0)

#define dlist_remove_head ( _l   ) 

Value:

do {\
                dlist_node_t n=(_l)->head;\
                if((_l)->tail==(_l)->head) {\
                        (_l)->head=NULL;\
                        (_l)->tail=NULL;\
                } else {\
                        (_l)->head = n->next;\
                        (_l)->head->prev = NULL;\
                }\
                snode_del(n);\
        } while(0)

#define dlist_remove_head_no_free ( _l   ) 

Value:

do {\
                dlist_node_t n=(_l)->head;\
                if((_l)->tail==(_l)->head) {\
                        (_l)->head=NULL;\
                        (_l)->tail=NULL;\
                } else {\
                        (_l)->head = n->next;\
                        (_l)->head->prev = NULL;\
                }\
        } while(0)

#define dlist_remove_tail ( _l   ) 

Value:

do {\
                dlist_node_t n=(_l)->tail;\
                if((_l)->tail==(_l)->head) {\
                        (_l)->head=NULL;\
                        (_l)->tail=NULL;\
                } else {\
                        (_l)->tail = n->prev;\
                        (_l)->tail->next = NULL;\
                }\
                dnode_del(n);\
        } while(0)

#define dlist_remove_tail_no_free ( _l   ) 

Value:

do {\
                dlist_node_t n=(_l)->tail;\
                if((_l)->tail==(_l)->head) {\
                        (_l)->head=NULL;\
                        (_l)->tail=NULL;\
                } else {\
                        (_l)->tail = n->prev;\
                        (_l)->tail->next = NULL;\
                }\
        } while(0)

#define dlist_remove ( _l,
_n   ) 

Value:

do {\
                if((_n)==(_l)->head) {\
                        dlist_remove_head(_l);\
                } else if((_n)==(_l)->tail) {\
                        dlist_remove_tail(_l);\
                } else {\
                        (_n)->next->prev=(_n)->prev;\
                        (_n)->prev->next=(_n)->next;\
                        dnode_del(_n);\
                }\
        } while(0)

#define dlist_remove_no_free ( _l,
_n   ) 

Value:

do {\
                if((_n)==(_l)->head) {\
                        dlist_remove_head_no_free(_l);\
                } else if((_n)==(_l)->tail) {\
                        dlist_remove_tail_no_free(_l);\
                } else {\
                        (_n)->next->prev=(_n)->prev;\
                        (_n)->prev->next=(_n)->next;\
                }\
        } while(0)

#define dlist_forward ( _l,
_t,
_f   ) 

Value:

do {\
                dlist_node_t n=list_head(_l);\
                while(n!=NULL) {\
                        _f(node_value(_t,n));\
                        n=n->next;\
                }\
        } while(0)

#define dlist_reverse ( _l,
_t,
_f   ) 

Value:

do {\
                dlist_node_t n=list_tail(_l);\
                while(n!=NULL) {\
                        _f(node_value(_t,n));\
                        n=n->prev;\
                }\
        } while(0)

#define slist_insert_sorted ( _l,
_n,
_cmp   ) 

Value:

do {\
                slist_node_t r=(_l)->head;\
                if(r==NULL) {\
                        dlist_insert_head(_l,_n);\
                } else if(_cmp((_l)->tail,_n)<=0) {\
                        dlist_insert_tail(_l,_n);\
                } else {\
                        while(_cmp(_n,r)<0) {\
                                r=r->next;\
                        }\
                        (_n)->next=r->next;\
                        if(r->next==NULL) {\
                                (_l)->tail=(_n);\
                        }\
                        r->next=(_n);\
                }\
        } while(0)

#define dlist_flush ( _l   ) 

Value:

do {\
                dlist_node_t q,n=list_head(_l);\
                while(n!=NULL) {\
                        q=n->next;\
                        free(n);\
                        n=q;\
                }\
        } while(0)

#define debug ( _n   )     vm_printf("[%p]<- %p -> [%p]\n",(_n)->sched_data.prev,(_n),(_n)->sched_data.next)

#define dlist_insert_sorted ( _l,
_n,
_cmp   ) 

Value:

do {\
                dlist_node_t r=(_l)->head;\
                if(r==NULL||_cmp(_n,r)<=0) {\
                        dlist_insert_head_node(_l,(_n));\
                } else if(_cmp((_l)->tail,(_n))<=0) {\
                        dlist_insert_tail_node(_l,(_n));\
                } else {\
                        while(r&&_cmp((_n),r)<0) {\
                                r=r->next;\
                        }\
                        if(!r) {\
                                vm_printf("PROUUUUUUUT\n");\
                                dlist_forward(_l,thread_t,debug);\
                        }\
                        (_n)->next=r->next;\
                        (_n)->prev=r;\
                        if(r->next==NULL) {\
                                (_l)->tail=(_n);\
                        } else {\
                                r->next->prev=(_n);\
                        }\
                        r->next=(_n);\
                }\
        } while(0)


Typedef Documentation

typedef struct _dlist_node_t* dlist_node_t

typedef struct _dlist_t* dlist_t


Function Documentation

void dlist_init ( dlist_t   )  [inline]

dlist_t dlist_new (  ) 

void dlist_del ( dlist_t   ) 


Generated on Wed Feb 6 14:46:05 2008 for TinyaML by  doxygen 1.5.3