mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	spa: add SPA_FOR_EACH_ELEMENT for array traversal
This commit is contained in:
		
							parent
							
								
									5a69a04cfe
								
							
						
					
					
						commit
						4d45182801
					
				
					 2 changed files with 37 additions and 0 deletions
				
			
		| 
						 | 
					@ -106,6 +106,18 @@ struct spa_fraction {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPA_N_ELEMENTS(arr)  (sizeof(arr) / sizeof((arr)[0]))
 | 
					#define SPA_N_ELEMENTS(arr)  (sizeof(arr) / sizeof((arr)[0]))
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Array iterator macro. Usage:
 | 
				
			||||||
 | 
					 * ```c
 | 
				
			||||||
 | 
					 * struct foo *array[16];
 | 
				
			||||||
 | 
					 * struct foo *f;
 | 
				
			||||||
 | 
					 * SPA_FOR_EACH_ELEMENT(array, f) {
 | 
				
			||||||
 | 
					 *	f->bar = baz;
 | 
				
			||||||
 | 
					 * }
 | 
				
			||||||
 | 
					 * ```
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define SPA_FOR_EACH_ELEMENT(arr, ptr) \
 | 
				
			||||||
 | 
						for (ptr = arr; (void*)ptr < SPA_PTROFF(arr, sizeof(arr), void); ptr++)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPA_MIN(a,b)		\
 | 
					#define SPA_MIN(a,b)		\
 | 
				
			||||||
({				\
 | 
					({				\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,6 +139,10 @@ static void test_abi(void)
 | 
				
			||||||
static void test_macros(void)
 | 
					static void test_macros(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t ptr[64];
 | 
						uint8_t ptr[64];
 | 
				
			||||||
 | 
						uint16_t i16[14];
 | 
				
			||||||
 | 
						uint32_t i32[10];
 | 
				
			||||||
 | 
						uint64_t i64[12];
 | 
				
			||||||
 | 
						unsigned char c[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_assert(SPA_MIN(1, 2) == 1);
 | 
						spa_assert(SPA_MIN(1, 2) == 1);
 | 
				
			||||||
	spa_assert(SPA_MIN(1, -2) == -2);
 | 
						spa_assert(SPA_MIN(1, -2) == -2);
 | 
				
			||||||
| 
						 | 
					@ -155,6 +159,27 @@ static void test_macros(void)
 | 
				
			||||||
	spa_assert(SPA_MEMBER(ptr, 0, void) == SPA_PTROFF(ptr, 0, void));
 | 
						spa_assert(SPA_MEMBER(ptr, 0, void) == SPA_PTROFF(ptr, 0, void));
 | 
				
			||||||
	spa_assert(SPA_MEMBER_ALIGN(ptr, 0, 4, void) == SPA_PTROFF_ALIGN(ptr, 0, 4, void));
 | 
						spa_assert(SPA_MEMBER_ALIGN(ptr, 0, 4, void) == SPA_PTROFF_ALIGN(ptr, 0, 4, void));
 | 
				
			||||||
	spa_assert(SPA_MEMBER_ALIGN(ptr, 4, 32, void) == SPA_PTROFF_ALIGN(ptr, 4, 32, void));
 | 
						spa_assert(SPA_MEMBER_ALIGN(ptr, 4, 32, void) == SPA_PTROFF_ALIGN(ptr, 4, 32, void));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_assert(SPA_N_ELEMENTS(ptr) == 64);
 | 
				
			||||||
 | 
						spa_assert(SPA_N_ELEMENTS(i32) == 10);
 | 
				
			||||||
 | 
						spa_assert(SPA_N_ELEMENTS(i64) == 12);
 | 
				
			||||||
 | 
						spa_assert(SPA_N_ELEMENTS(i16) == 14);
 | 
				
			||||||
 | 
						spa_assert(SPA_N_ELEMENTS(c) == 16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define check_traversal(array_) \
 | 
				
			||||||
 | 
						{ \
 | 
				
			||||||
 | 
							__typeof__(array_[0]) *it; \
 | 
				
			||||||
 | 
							int count = 0; \
 | 
				
			||||||
 | 
							SPA_FOR_EACH_ELEMENT(array_, it) \
 | 
				
			||||||
 | 
								*it = count++; \
 | 
				
			||||||
 | 
							for (size_t i = 0; i < SPA_N_ELEMENTS(array_); i++) \
 | 
				
			||||||
 | 
								spa_assert(array_[i] == i); \
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						check_traversal(ptr);
 | 
				
			||||||
 | 
						check_traversal(i64);
 | 
				
			||||||
 | 
						check_traversal(i32);
 | 
				
			||||||
 | 
						check_traversal(i16);
 | 
				
			||||||
 | 
						check_traversal(c);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void test_result(void)
 | 
					static void test_result(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue