qblist.h | qblist.h | |||
---|---|---|---|---|
skipping to change at line 31 | skipping to change at line 31 | |||
#ifndef QB_LIST_H_DEFINED | #ifndef QB_LIST_H_DEFINED | |||
#define QB_LIST_H_DEFINED | #define QB_LIST_H_DEFINED | |||
/* *INDENT-OFF* */ | /* *INDENT-OFF* */ | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
extern "C" { | extern "C" { | |||
#endif | #endif | |||
/* *INDENT-ON* */ | /* *INDENT-ON* */ | |||
#include <stdint.h> | #include <stdint.h> | |||
#include <qb/qbdefs.h> | ||||
/** | /** | |||
* @file qblist.h | * @file qblist.h | |||
* This is a kernel style list implementation. | * This is a kernel style list implementation. | |||
* | * | |||
* @author Steven Dake <sdake@redhat.com> | * @author Steven Dake <sdake@redhat.com> | |||
*/ | */ | |||
struct qb_list_head { | struct qb_list_head { | |||
struct qb_list_head *next; | struct qb_list_head *next; | |||
skipping to change at line 61 | skipping to change at line 62 | |||
#define QB_INIT_LIST_HEAD(ptr) do { \ | #define QB_INIT_LIST_HEAD(ptr) do { \ | |||
(ptr)->next = (ptr); (ptr)->prev = (ptr); \ | (ptr)->next = (ptr); (ptr)->prev = (ptr); \ | |||
} while (0) | } while (0) | |||
/** | /** | |||
* Initialize the list entry. | * Initialize the list entry. | |||
* | * | |||
* Points next and prev pointers to head. | * Points next and prev pointers to head. | |||
* @param head pointer to the list head | * @param head pointer to the list head | |||
*/ | */ | |||
static void inline qb_list_init(struct qb_list_head *head) | static inline void qb_list_init(struct qb_list_head *head) | |||
{ | { | |||
head->next = head; | head->next = head; | |||
head->prev = head; | head->prev = head; | |||
} | } | |||
/** | /** | |||
* Add this element to the list. | * Add this element to the list. | |||
* | * | |||
* @param element the new element to insert. | * @param element the new element to insert. | |||
* @param head pointer to the list head | * @param head pointer to the list head | |||
*/ | */ | |||
static void inline qb_list_add(struct qb_list_head *element, | static inline void qb_list_add(struct qb_list_head *element, | |||
struct qb_list_head *head) | struct qb_list_head *head) | |||
{ | { | |||
head->next->prev = element; | head->next->prev = element; | |||
element->next = head->next; | element->next = head->next; | |||
element->prev = head; | element->prev = head; | |||
head->next = element; | head->next = element; | |||
} | } | |||
/** | /** | |||
* Add to the list (but at the end of the list). | * Add to the list (but at the end of the list). | |||
* | * | |||
* @param element pointer to the element to add | * @param element pointer to the element to add | |||
* @param head pointer to the list head | * @param head pointer to the list head | |||
* @see qb_list_add() | * @see qb_list_add() | |||
*/ | */ | |||
static void inline qb_list_add_tail(struct qb_list_head *element, | static inline void qb_list_add_tail(struct qb_list_head *element, | |||
struct qb_list_head *head) | struct qb_list_head *head) | |||
{ | { | |||
head->prev->next = element; | head->prev->next = element; | |||
element->next = head; | element->next = head; | |||
element->prev = head->prev; | element->prev = head->prev; | |||
head->prev = element; | head->prev = element; | |||
} | } | |||
/** | /** | |||
* Delete an entry from the list. | * Delete an entry from the list. | |||
* | * | |||
* @param _remove the list item to remove | * @param _remove the list item to remove | |||
*/ | */ | |||
static void inline qb_list_del(struct qb_list_head *_remove) | static inline void qb_list_del(struct qb_list_head *_remove) | |||
{ | { | |||
_remove->next->prev = _remove->prev; | _remove->next->prev = _remove->prev; | |||
_remove->prev->next = _remove->next; | _remove->prev->next = _remove->next; | |||
} | } | |||
/** | /** | |||
* A quick test to see if the list is empty (pointing to it's self). | * A quick test to see if the list is empty (pointing to it's self). | |||
* @param head pointer to the list head | * @param head pointer to the list head | |||
* @return boolean true/false | * @return boolean true/false | |||
*/ | */ | |||
skipping to change at line 198 | skipping to change at line 199 | |||
* @param pos: the type to use as a loop counter. | * @param pos: the type to use as a loop counter. | |||
* @param head: the head for your list. | * @param head: the head for your list. | |||
* @param member: the name of the list_struct within the struct. | * @param member: the name of the list_struct within the struct. | |||
*/ | */ | |||
#define qb_list_for_each_entry_reverse(pos, head, member) \ | #define qb_list_for_each_entry_reverse(pos, head, member) \ | |||
for (pos = qb_list_entry((head)->prev, typeof(*pos), member); \ | for (pos = qb_list_entry((head)->prev, typeof(*pos), member); \ | |||
&pos->member != (head); \ | &pos->member != (head); \ | |||
pos = qb_list_entry(pos->member.prev, typeof(*pos), member)) | pos = qb_list_entry(pos->member.prev, typeof(*pos), member)) | |||
/** | /** | |||
* Iterate over list of given type safe against removal of list entry | ||||
* @param pos: the type * to use as a loop cursor. | ||||
* @param n: another type * to use as temporary storage | ||||
* @param head: the head for your list. | ||||
* @param member: the name of the list_struct within the struct. | ||||
*/ | ||||
#define qb_list_for_each_entry_safe(pos, n, head, member) | ||||
\ | ||||
for (pos = qb_list_entry((head)->next, typeof(*pos), member), | ||||
\ | ||||
n = qb_list_entry(pos->member.next, typeof(*pos), member); | ||||
\ | ||||
&pos->member != (head); | ||||
\ | ||||
pos = n, n = qb_list_entry(n->member.next, typeof(*n), member)) | ||||
/** | ||||
* Iterate backwards over list safe against removal | ||||
* @param pos: the type * to use as a loop cursor. | ||||
* @param n: another type * to use as temporary storage | ||||
* @param head: the head for your list. | ||||
* @param member: the name of the list_struct within the struct. | ||||
*/ | ||||
#define qb_list_for_each_entry_safe_reverse(pos, n, head, member) | ||||
\ | ||||
for (pos = qb_list_entry((head)->prev, typeof(*pos), member), | ||||
\ | ||||
n = qb_list_entry(pos->member.prev, typeof(*pos), member); | ||||
\ | ||||
&pos->member != (head); | ||||
\ | ||||
pos = n, n = qb_list_entry(n->member.prev, typeof(*n), member)) | ||||
/** | ||||
* Count the number of items in the list. | * Count the number of items in the list. | |||
* @param head: the head for your list. | * @param head: the head for your list. | |||
* @return length of the list. | * @return length of the list. | |||
*/ | */ | |||
static inline int32_t qb_list_length(struct qb_list_head *head) | static inline int32_t qb_list_length(struct qb_list_head *head) | |||
{ | { | |||
struct qb_list_head *item; | struct qb_list_head *item; | |||
int32_t length = 0; | int32_t length = 0; | |||
qb_list_for_each(item, head) | qb_list_for_each(item, head) | |||
End of changes. 6 change blocks. | ||||
4 lines changed or deleted | 39 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |