/**
* tlist_top - get the first entry in a list
* @h: the tlist
- * @type: the type of the entry
* @member: the list_node member of the type
*
* If the list is empty, returns NULL.
*
* Example:
* struct child *first;
- * first = tlist_top(&parent->children, struct child, list);
+ * first = tlist_top(&parent->children, list);
+ * if (!first)
+ * printf("Empty list!\n");
*/
-#define tlist_top(h, type, member) \
- list_top(tlist_raw((h), (type *)NULL), type, member)
+#define tlist_top(h, member) \
+ ((tcon_type((h), canary)) \
+ list_top_(&(h)->raw, \
+ (char *)(&(h)->_tcon[0].canary->member) - \
+ (char *)((h)->_tcon[0].canary)))
/**
* tlist_tail - get the last entry in a list
* @h: the tlist
- * @type: the type of the entry
* @member: the list_node member of the type
*
* If the list is empty, returns NULL.
*
* Example:
* struct child *last;
- * last = tlist_tail(&parent->children, struct child, list);
+ * last = tlist_tail(&parent->children, list);
+ * if (!last)
+ * printf("Empty list!\n");
*/
-#define tlist_tail(h, type, member) \
- list_tail(tlist_raw((h), (type *)NULL), type, member)
+#define tlist_tail(h, member) \
+ ((tcon_type((h), canary)) \
+ list_tail_(&(h)->raw, \
+ (char *)(&(h)->_tcon[0].canary->member) - \
+ (char *)((h)->_tcon[0].canary)))
/**
* tlist_for_each - iterate through a list.
#define tlist_for_each(h, i, member) \
list_for_each(tlist_raw((h), (i)), (i), member)
+/**
+ * tlist_for_each - iterate through a list backwards.
+ * @h: the tlist
+ * @i: an iterator of suitable type for this list.
+ * @member: the list_node member of @i
+ *
+ * This is a convenient wrapper to iterate @i over the entire list. It's
+ * a for loop, so you can break and continue as normal.
+ *
+ * Example:
+ * tlist_for_each_rev(&parent->children, child, list)
+ * printf("Name: %s\n", child->name);
+ */
+#define tlist_for_each_rev(h, i, member) \
+ list_for_each_rev(tlist_raw((h), (i)), (i), member)
+
/**
* tlist_for_each_safe - iterate through a list, maybe during deletion
* @h: the tlist