map.inc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. type
  2. Ppw_map = ^Tpw_map;
  3. Ppw_map_item = ^Tpw_map_item;
  4. Tuintptr_t = Pointer;
  5. Tpw_map_item = record
  6. case longint of
  7. 0: (Next: Tuintptr_t);
  8. 1: (Data: pointer);
  9. end;
  10. Tpw_map = record
  11. items: Tpw_array;
  12. free_list: Tuint32_t;
  13. end;
  14. {
  15. static inline void pw_map_init(struct pw_map *map, size_t size, size_t extend)
  16. pw_array_init(&map->items, extend * sizeof(union pw_map_item));
  17. pw_array_ensure_size(&map->items, size * sizeof(union pw_map_item));
  18. map->free_list = ((uint32_t)0xffffffff);
  19. static inline void pw_map_clear(struct pw_map *map)
  20. pw_array_clear(&map->items);
  21. static inline void pw_map_reset(struct pw_map *map)
  22. pw_array_reset(&map->items);
  23. map->free_list = ((uint32_t)0xffffffff);
  24. static inline uint32_t pw_map_insert_new(struct pw_map *map, void *data)
  25. union pw_map_item *start, *item;
  26. uint32_t id;
  27. if (map->free_list != ((uint32_t)0xffffffff))
  28. start = (union pw_map_item *) map->items.data;
  29. item = &start[map->free_list >> 1];
  30. map->free_list = item->next;
  31. else
  32. item = (union pw_map_item *) pw_array_add(&map->items, sizeof(union pw_map_item));
  33. if (item ==
  34. # 157 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  35. ((void *)0)
  36. # 157 "/usr/include/pipewire-0.3/pipewire/map.h"
  37. )
  38. return ((uint32_t)0xffffffff);
  39. start = (union pw_map_item *) map->items.data;
  40. item->data = data;
  41. id = (item - start);
  42. return id;
  43. # 173 "/usr/include/pipewire-0.3/pipewire/map.h"
  44. static inline int pw_map_insert_at(struct pw_map *map, uint32_t id, void *data)
  45. size_t size = ((&(map)->items)->size / (sizeof(union pw_map_item)));
  46. union pw_map_item *item;
  47. if (id > size)
  48. return -
  49. # 179 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  50. 28
  51. # 179 "/usr/include/pipewire-0.3/pipewire/map.h"
  52. ;
  53. else if (id == size)
  54. item = (union pw_map_item *) pw_array_add(&map->items, sizeof(union pw_map_item));
  55. if (item ==
  56. # 182 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  57. ((void *)0)
  58. # 182 "/usr/include/pipewire-0.3/pipewire/map.h"
  59. )
  60. return -
  61. # 183 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  62. (*__errno_location ())
  63. # 183 "/usr/include/pipewire-0.3/pipewire/map.h"
  64. ;
  65. else
  66. item = ((union pw_map_item*)((uintptr_t)((&(map)->items)->data) + (ptrdiff_t)((id)*(sizeof(union pw_map_item)))));
  67. if (((item)->next & 0x1))
  68. return -
  69. # 187 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  70. 22
  71. # 187 "/usr/include/pipewire-0.3/pipewire/map.h"
  72. ;
  73. item->data = data;
  74. return 0;
  75. static inline void pw_map_remove(struct pw_map *map, uint32_t id)
  76. if ((((((union pw_map_item*)((uintptr_t)((&(map)->items)->data) + (ptrdiff_t)((id)*(sizeof(union pw_map_item))))))->next & 0x1)))
  77. return;
  78. ((union pw_map_item*)((uintptr_t)((&(map)->items)->data) + (ptrdiff_t)((id)*(sizeof(union pw_map_item)))))->next = map->free_list;
  79. map->free_list = (id << 1) | 1;
  80. static inline void *pw_map_lookup(struct pw_map *map, uint32_t id)
  81. if ((__builtin_expect(!!(((id) < ((&(map)->items)->size / (sizeof(union pw_map_item))))),1)))
  82. union pw_map_item *item = ((union pw_map_item*)((uintptr_t)((&(map)->items)->data) + (ptrdiff_t)((id)*(sizeof(union pw_map_item)))));
  83. if (!((item)->next & 0x1))
  84. return item->data;
  85. return
  86. # 219 "/usr/include/pipewire-0.3/pipewire/map.h" 3 4
  87. ((void *)0)
  88. # 219 "/usr/include/pipewire-0.3/pipewire/map.h"
  89. ;
  90. # 230 "/usr/include/pipewire-0.3/pipewire/map.h"
  91. static inline int pw_map_for_each(struct pw_map *map,
  92. int (*func) (void *item_data, void *data), void *data)
  93. union pw_map_item *item;
  94. int res = 0;
  95. for (item = (__typeof__(item)) ((&map->items)->data); (((void*)((uintptr_t)(item) + (ptrdiff_t)(sizeof(*item)))) <= ((void*)((uintptr_t)((&map->items)->data) + (ptrdiff_t)((&map->items)->size)))); (item)++)
  96. if (!((item)->next & 0x1))
  97. if ((res = func(item->data, data)) != 0)
  98. break;
  99. return res;
  100. }