diff --git a/core/src/list.c b/core/src/list.c index 68a416b..d53cb6e 100644 --- a/core/src/list.c +++ b/core/src/list.c @@ -161,3 +161,18 @@ void* list_iterator_begin(List* self) { void* list_iterator_end(List* self) { return list_at_unchecked(self, self->len); } + +size_t list_contains(List* self, void* query) { + union { + uint8_t* as_byte; + void* as_void; + } data = { + .as_void = self->data + }; + for(size_t i = 0; i < self->len; ++i) { + if(memcmp(data.as_byte + i * self->element_size, query, self->element_size) == 0) { + return i; + } + } + return self->len; +} diff --git a/core/src/list.h b/core/src/list.h index 6f8789f..e79e206 100644 --- a/core/src/list.h +++ b/core/src/list.h @@ -26,6 +26,8 @@ extern void list_erase(List* self, size_t at); extern void* list_iterator_begin(List* self); extern void* list_iterator_end(List* self); +extern size_t list_contains(List* self, void* query); + #define list_from_type(T) list_init(sizeof(T)) #define list_foreach(T, iter, list) for(T iter = list_iterator_begin(list); iter != (T)list_iterator_end(list); ++iter) #define list_at_as(T, __list, __i) ((T*)(list_at(__list, __i)))