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_t * | dlist_t |
Functions | |
void | dlist_init (dlist_t) |
dlist_t | dlist_new () |
void | dlist_del (dlist_t) |
#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 struct _dlist_node_t* dlist_node_t |
void dlist_init | ( | dlist_t | ) | [inline] |
dlist_t dlist_new | ( | ) |
void dlist_del | ( | dlist_t | ) |