static uint32_t trait_count(compile_t* c, gentype_t* g, uint32_t** list, size_t* list_size) { switch(g->underlying) { case TK_PRIMITIVE: case TK_CLASS: case TK_ACTOR: { reachable_type_t* t = reach_type(c->reachable, g->type_name); assert(t != NULL); uint32_t count = (uint32_t)reachable_type_cache_size(&t->subtypes); if(count == 0) return 0; // Sort the trait identifiers. size_t tid_size = count * sizeof(uint32_t); uint32_t* tid = (uint32_t*)pool_alloc_size(tid_size); size_t i = HASHMAP_BEGIN; size_t index = 0; reachable_type_t* provide; while((provide = reachable_type_cache_next(&t->subtypes, &i)) != NULL) tid[index++] = provide->type_id; qsort(tid, index, sizeof(uint32_t), cmp_uint32); count = (uint32_t)unique_uint32(tid, index); if(list != NULL) { *list = tid; *list_size = tid_size; } else { pool_free_size(tid_size, tid); } return count; } default: {} } return 0; }
static uint32_t trait_count(compile_t* c, gentype_t* g) { switch(g->underlying) { case TK_PRIMITIVE: case TK_CLASS: case TK_ACTOR: { reachable_type_t* t = reach_type(c->reachable, g->type_name); assert(t != NULL); return (uint32_t)reachable_type_cache_size(&t->subtypes); } default: {} } return 0; }