13#ifndef INCLUDE_ZEPHYR_SYS_ITERABLE_SECTIONS_H_
14#define INCLUDE_ZEPHYR_SYS_ITERABLE_SECTIONS_H_
48#define TYPE_SECTION_ITERABLE(type, varname, secname, section_postfix) \
49 Z_DECL_ALIGN(type) varname \
50 __in_section(_##secname, static, _CONCAT(section_postfix, _)) __used __noasan
61#define TYPE_SECTION_START(secname) _CONCAT(_##secname, _list_start)
71#define TYPE_SECTION_END(secname) _CONCAT(_##secname, _list_end)
84#define TYPE_SECTION_START_EXTERN(type, secname) \
85 extern type TYPE_SECTION_START(secname)[]
98#define TYPE_SECTION_END_EXTERN(type, secname) \
99 extern type TYPE_SECTION_END(secname)[]
111#define TYPE_SECTION_FOREACH(type, secname, iterator) \
112 TYPE_SECTION_START_EXTERN(type, secname); \
113 TYPE_SECTION_END_EXTERN(type, secname); \
114 for (type * iterator = TYPE_SECTION_START(secname); ({ \
115 __ASSERT(iterator <= TYPE_SECTION_END(secname),\
116 "unexpected list end location"); \
117 iterator < TYPE_SECTION_END(secname); \
133#define TYPE_SECTION_FOREACH_REVERSE(type, secname, iterator) \
134 TYPE_SECTION_START_EXTERN(type, secname); \
135 TYPE_SECTION_END_EXTERN(type, secname); \
136 for (type *iterator = TYPE_SECTION_END(secname); \
137 (uintptr_t)iterator > (uintptr_t)TYPE_SECTION_START(secname) && \
138 (iterator = (type *)((uintptr_t)iterator - sizeof(type)), true); \
151#define TYPE_SECTION_GET(type, secname, i, dst) do { \
152 TYPE_SECTION_START_EXTERN(type, secname); \
153 *(dst) = &TYPE_SECTION_START(secname)[i]; \
163#define TYPE_SECTION_COUNT(type, secname, dst) do { \
164 TYPE_SECTION_START_EXTERN(type, secname); \
165 TYPE_SECTION_END_EXTERN(type, secname); \
166 *(dst) = ((uintptr_t)TYPE_SECTION_END(secname) - \
167 (uintptr_t)TYPE_SECTION_START(secname)) / sizeof(type); \
175#define STRUCT_SECTION_START(struct_type) \
176 TYPE_SECTION_START(struct_type)
185#define STRUCT_SECTION_START_EXTERN(struct_type) \
186 TYPE_SECTION_START_EXTERN(struct struct_type, struct_type)
193#define STRUCT_SECTION_END(struct_type) \
194 TYPE_SECTION_END(struct_type)
203#define STRUCT_SECTION_END_EXTERN(struct_type) \
204 TYPE_SECTION_END_EXTERN(struct struct_type, struct_type)
214#define STRUCT_SECTION_ITERABLE_ALTERNATE(secname, struct_type, varname) \
215 TYPE_SECTION_ITERABLE(struct struct_type, varname, secname, varname)
223#define STRUCT_SECTION_ITERABLE_ARRAY_ALTERNATE(secname, struct_type, varname, \
225 TYPE_SECTION_ITERABLE(struct struct_type, varname[size], secname, \
242#define STRUCT_SECTION_ITERABLE(struct_type, varname) \
243 STRUCT_SECTION_ITERABLE_ALTERNATE(struct_type, struct_type, varname)
250#define STRUCT_SECTION_ITERABLE_ARRAY(struct_type, varname, size) \
251 STRUCT_SECTION_ITERABLE_ARRAY_ALTERNATE(struct_type, struct_type, \
260#define STRUCT_SECTION_ITERABLE_NAMED(struct_type, name, varname) \
261 TYPE_SECTION_ITERABLE(struct struct_type, varname, struct_type, name)
270#define STRUCT_SECTION_ITERABLE_NAMED_ALTERNATE(struct_type, secname, name, varname) \
271 TYPE_SECTION_ITERABLE(struct struct_type, varname, secname, name)
283#define STRUCT_SECTION_FOREACH_ALTERNATE(secname, struct_type, iterator) \
284 TYPE_SECTION_FOREACH(struct struct_type, secname, iterator)
296#define STRUCT_SECTION_FOREACH(struct_type, iterator) \
297 STRUCT_SECTION_FOREACH_ALTERNATE(struct_type, struct_type, iterator)
311#define STRUCT_SECTION_FOREACH_ALTERNATE_REVERSE(secname, struct_type, iterator) \
312 TYPE_SECTION_FOREACH_REVERSE(struct struct_type, secname, iterator)
325#define STRUCT_SECTION_FOREACH_REVERSE(struct_type, iterator) \
326 STRUCT_SECTION_FOREACH_ALTERNATE_REVERSE(struct_type, struct_type, iterator)
337#define STRUCT_SECTION_GET(struct_type, i, dst) \
338 TYPE_SECTION_GET(struct struct_type, struct_type, i, dst)
346#define STRUCT_SECTION_COUNT(struct_type, dst) \
347 TYPE_SECTION_COUNT(struct struct_type, struct_type, dst);