void test_list(void) { SECTION_BEGIN("List"); List list; printf("list init\n"); list_init(&list, sizeof(int)); assert(list_length(&list) == 0); printf("list adding\n"); int n = 1; list_addfront(&list, &n); n = 2; list_addfront(&list, &n); n = 3; list_addfront(&list, &n); n = 10; list_addback(&list, &n); assert(list_length(&list) == 4); Iterator front_it; Iterator back_it; list_first(&list, &front_it); list_next(&list, &front_it); list_last(&list, &back_it); list_moveafter(&list, &front_it, &back_it); list_remove(&list, &front_it); Iterator it; list_first(&list, &it); printf("list iterating\n"); while(iterator_value(&it)) { printf("val: %d\n", *((int*)iterator_value(&it))); list_next(&list, &it); } assert(list_datasize(&list) == sizeof(int) * 3); int *buf = alloca(list_datasize(&list)); list_tobuffer(&list, buf); int i; for(i = 0; i < 3; i++) { printf("bufn: %d\n", buf[i]); } SECTION_END("List"); }
uint8_t* lupdate_freqcount(uint8_t* bwt,uint32_t size,uint8_t* output,uint64_t* c) { uint32_t chr,i; int32_t cost; list_t* lst; lnode_t* found,*tmp; lst = lupdate_createlist(); *c = 0; for (i=0; i<size; i++) { chr = bwt[i]; found = list_find(lst,chr,&cost); output[i] = (uint8_t) cost; *c += cost; /* reorder */ found->freq++; tmp = found->prev; while (tmp != NULL && found->freq > tmp->freq) { tmp = tmp->prev; } if (tmp == NULL) { list_movetofront(lst,found); } else { list_moveafter(found,tmp); } } list_free(lst); return output; }