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