408
return hashmap_iter_next(iter);
409
}
410
411
-#define hashmap_iter_next_entry(iter, type, member) \
412
- container_of_or_null(hashmap_iter_next(iter), type, member)
413
-
411
+/*
412
+ * returns the first entry in @map using @iter, where the entry is of
413
+ * @type (e.g. "struct foo") and @member is the name of the
414
+ * "struct hashmap_entry" in @type
415
+ */
416
#define hashmap_iter_first_entry(map, iter, type, member) \
417
container_of_or_null(hashmap_iter_first(map, iter), type, member)
418
417
-#define hashmap_for_each_entry(map, iter, var, type, member) \
418
- for (var = hashmap_iter_first_entry(map, iter, type, member); \
419
+/* internal macro for hashmap_for_each_entry */
420
+#define hashmap_iter_next_entry_offset(iter, offset) \
421
+ container_of_or_null_offset(hashmap_iter_next(iter), offset)
422
+
423
+/* internal macro for hashmap_for_each_entry */
424
+#define hashmap_iter_first_entry_offset(map, iter, offset) \
425
+ container_of_or_null_offset(hashmap_iter_first(map, iter), offset)
426
+
427
+/*
428
+ * iterate through @map using @iter, @var is a pointer to a type
429
+ * containing a @member which is a "struct hashmap_entry"
430
+ */
431
+#define hashmap_for_each_entry(map, iter, var, member) \
432
+ for (var = hashmap_iter_first_entry_offset(map, iter, \
433
+ OFFSETOF_VAR(var, member)); \
434
var; \
420
- var = hashmap_iter_next_entry(iter, type, member))
435
+ var = hashmap_iter_next_entry_offset(iter, \
436
+ OFFSETOF_VAR(var, member)))
437
438
/*
439
* returns a @pointer of @type matching @keyvar, or NULL if nothing found.
448
container_of_or_null(hashmap_get_from_hash(map, hash, keydata), \
449
type, member)
450
/*
435
- * returns the next equal @type pointer to @var, or NULL if not found.
436
- * @var is a pointer of @type
437
- * @member is the name of the "struct hashmap_entry" field in @type
451
+ * returns the next equal pointer to @var, or NULL if not found.
452
+ * @var is a pointer of any type containing "struct hashmap_entry"
453
+ * @member is the name of the "struct hashmap_entry" field
454
*/
439
-#define hashmap_get_next_entry(map, var, type, member) \
440
- container_of_or_null(hashmap_get_next(map, &(var)->member), \
441
- type, member)
455
+#define hashmap_get_next_entry(map, var, member) \
456
+ container_of_or_null_offset(hashmap_get_next(map, &(var)->member), \
457
+ OFFSETOF_VAR(var, member))
458
459
/*
460
* iterate @map starting from @var, where @var is a pointer of @type
461
* and @member is the name of the "struct hashmap_entry" field in @type
462
*/
447
-#define hashmap_for_each_entry_from(map, var, type, member) \
463
+#define hashmap_for_each_entry_from(map, var, member) \
464
for (; \
465
var; \
450
- var = hashmap_get_next_entry(map, var, type, member))
466
+ var = hashmap_get_next_entry(map, var, member))
467
468
/*
469
* Disable item counting and automatic rehashing when adding/removing items.