01 #ifndef SET_HH 02 #define SET_HH 21 03 CTask *mem_task=Fs; 04 class CI64Set { 05 I64 cnt,cap; 06 I64 *body; 07 }; 08 U0 I64SetDel(CI64Set *s) { 09 GCFree(s->body); 10 GCFree(s); 11 } 12 CI64Set *I64SetNew() { 13 CI64Set *s=GCCAlloc(sizeof(CI64Set)); 14 s->cap=16; 15 s->body=GCCAlloc(16*8); 16 return s; 17 } 18 Bool I64SetHas(CI64Set *s,I64 v) { 19 I64 i=s->cnt; 20 I64 *body=s->body; 21 while(i>0) 22 if(body[--i]==v) 23 return TRUE; 24 return FALSE; 25 } 26 U0 I64SetAdd(CI64Set *s,I64 v,Bool allow_repeats=FALSE) { 27 if(!allow_repeats) 28 if(I64SetHas(s,v)) 29 return; 30 I64 *new; 31 if(s->cnt+1>=s->cap) { 32 new=GCCAlloc(s->cap*8+16*8); 33 s->cap+=16; 34 MemCpy(new,s->body,s->cnt*8); 35 GCFree(s->body); 36 s->body=new; 37 } 38 s->body[s->cnt++]=v; 39 } 40 U0 I64SetAddAll(CI64Set *s,CI64Set *from) { 41 I64 idx=from->cnt; 42 while(--idx>=0) 43 I64SetAdd(s,from->body[idx]); 44 } 45 U0 I64SetRem(CI64Set *s,I64 v) { 46 I64 idx,ptr=0,del=0; 47 for(idx=0;idx!=s->cnt;idx++) { 48 if(s->body[idx]!=v) 49 s->body[ptr++]=s->body[idx]; 50 else 51 del++; 52 } 53 s->cnt-=del; 54 } 55 U0 I64SetRemAll(CI64Set *s,CI64Set *from) { 56 I64 idx=from->cnt; 57 while(--idx>=0) 58 I64SetRem(s,from->body[idx]); 59 } 60 #endif