7 virtual bool is(void* extra
)=0;
8 virtual void gc(GC
& gc
)=0;
10 class UniqueController
{
16 UniqueController(VM
& _vm
):vm(_vm
),capacity(0),occupancy(0),tab(0){}
17 UniqueBlock
* get(hash_t hash
,const VTable
* refVT
, void* extra
){
18 UniqueBlock
* c
=tab
[hash
%capacity
];
19 while(c
&&!(c
->hash
==hash
&&c
->refVT
==refVT
&&c
->is(extra
))){
24 void add(UniqueBlock
* n
){
25 if(capacity
>>1<occupancy
)grow();
26 n
->next
=tab
[n
->hash
%capacity
];
27 tab
[n
->hash
%capacity
]=n
;
30 size_t ocapacity
=capacity
;
31 UniqueBlock
** otab
=tab
;
32 capacity
=capacity
?((capacity
<<1)+1):31;
33 tab
=(UniqueBlock
**)operator new (capacity
*sizeof(UniqueBlock
*),vm
);
34 for(size_t i
=0;i
<capacity
;++i
){
37 for(size_t i
=0;i
<ocapacity
;++i
){
38 UniqueBlock
* c
=otab
[i
];
46 capacity
=(occupancy
<<1)+1;
47 tab
=(UniqueBlock
**)operator new (capacity
*sizeof(UniqueBlock
*),vm
);
48 for(size_t i
=0;i
<capacity
;++i
){
53 void gcIntoUnique(Node
& it
, GC
& gc
, Node
& dest
){
54 UniqueBlock
* u
=(UniqueBlock
*)it
.c
.ptr
;
65 m4_define(«PP_VTABLE_UNIQUE»
,«
PP_VTABLE_SET(«copyable»
,«
1»
) PP_VTABLE_SET(«gcInto»
,«
&gcIntoUnique»
) PP_VTABLE_SET(«gc»
,«
&gcDef
<&gcIntoUnique
>»
)»
)