#pragma once #include #include #include #include template struct keep{ size_t m;//length of d array size_t l;//number of elements with a set value size_t first;//lowest index size_t last;//highest index T *d; }; #ifndef kroundup32 #define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) #endif template void keep_info(keep *k,FILE *fp,int full,int hit){ fprintf(fp,"[%s] \t k->m:%lu hit:%d\n",__FUNCTION__,k->m,hit); for(size_t i=0;full&&im;i++) fprintf(stderr,"[%s]&k->d[%d]:%p ; k->d+%d:%p ; &k->d[%d+1]:%p k->d+%d+1:%p val:%d\n",__FUNCTION__,i,&k->d[i],i,k->d+i,i,&k->d[i]+1,i,k->d+i+1,k->d[i]); size_t tt =0; for(int i=0;im;i++) if(k->d[i]==hit) tt++; fprintf(stderr,"[%s]tt:%d first:%lu last:%lu\n",__FUNCTION__,tt,k->first,k->last); } template keep *keep_alloc(){ keep *ret =(keep*) calloc(1,sizeof(keep)); return ret; } template void realloc(keep *k,size_t newlen){ // fprintf(stderr,"[%s] k:%p k->m:%lu newlen:%lu\n",__FUNCTION__,k,k->m,newlen); kroundup32(newlen); k->d = (T*) realloc(k->d,sizeof(T)*newlen); assert(k->d!=NULL); memset(k->d+k->m,0,(newlen-k->m)*sizeof(T)); k->m=newlen; //fprintf(stderr,"[%s] k:%p k->m:%lu newlen:%lu\n",__FUNCTION__,k,k->m,newlen); } template void keep_set(keep *k,size_t pos,T val){ // fprintf(stderr,"[%s] first:%lu last:%lu pos:%lu\n",__FUNCTION__,k->first,k->last,pos); if(pos+1>k->m) realloc(k,pos+1); k->d[pos]=val; if(k->l==0){ k->first=pos; k->last=pos; }else{ if(posfirst) k->first=pos; if(pos>k->last) k->last=pos; } k->l++; //fprintf(stderr,"[%s] first:%lu last:%lu pos:%lu\n",__FUNCTION__,k->first,k->last,pos); } template void keep_destroy(keep *k){ if(k&&k->d){//<- for some reason valgrind complains about free(k->d); k->d=NULL; } free(k); k=NULL; } template void keep_clear(keep *k){ memset(k->d,0,k->m*sizeof(T)); k->m = k->first = k->last = k->l = 0; } template class keep; #ifdef __WITH_MAIN__ typedef char type; int main(int argc,char **argv){ keep *k =(keep *) alloc_keep(); set(k,1,2); set(k,2,1); set(k,3,1); set(k,3,2); set(k,4,2); set(k,4,1); set(k,7,4); set(k,8,4); set(k,15,10); set(k,16,10); destroy(k); } #endif