1 #include "Cello/Reference.h"
2
3 #include "Cello/Bool.h"
4 #include "Cello/Type.h"
5 #include "Cello/Exception.h"
6
7 #include <string.h>
8
9 var Reference = type_data {
10 type_begin(Reference),
11 type_entry(Reference, New),
12 type_entry(Reference, Assign),
13 type_entry(Reference, Copy),
14 type_entry(Reference, Eq),
15 type_entry(Reference, Hash),
16 type_entry(Reference, At),
17 type_entry(Reference, With),
18 type_entry(Reference, Show),
19 type_end(Reference)
20 };
21
Reference_New(var self,var_list vl)22 var Reference_New(var self, var_list vl) {
23 ReferenceData* rd = cast(self, Reference);
24 rd->ref = var_list_get(vl);
25 return rd;
26 }
27
Reference_Delete(var self)28 var Reference_Delete(var self) {
29 return self;
30 }
31
Reference_Size(void)32 size_t Reference_Size(void) {
33 return sizeof(ReferenceData);
34 }
35
Reference_Assign(var self,var obj)36 void Reference_Assign(var self, var obj) {
37 ReferenceData* rd0 = cast(self, Reference);
38 ReferenceData* rd1 = cast(obj, Reference);
39 rd0->ref = rd1->ref;
40 }
41
Reference_Copy(var self)42 var Reference_Copy(var self) {
43 ReferenceData* rd = cast(self, Reference);
44 return new(Reference, rd->ref);
45 }
46
Reference_Eq(var self,var obj)47 var Reference_Eq(var self, var obj) {
48 ReferenceData* rd0 = cast(self, Reference);
49 ReferenceData* rd1 = cast(obj, Reference);
50 return bool_var(rd0->ref is rd1->ref);
51 }
52
Reference_Hash(var self)53 long Reference_Hash(var self) {
54 ReferenceData* rd = cast(self, Reference);
55 return (long)(intptr_t)(rd->ref);
56 }
57
Reference_At(var self,int i)58 var Reference_At(var self, int i) {
59 ReferenceData* rd = cast(self, Reference);
60 return rd->ref;
61 }
62
Reference_Set(var self,int i,var x)63 void Reference_Set(var self, int i, var x) {
64 ReferenceData* rd = cast(self, Reference);
65 rd->ref = x;
66 }
67
Reference_Exit(var self)68 void Reference_Exit(var self) {
69 ReferenceData* rd = cast(self, Reference);
70 delete(rd->ref);
71 }
72
Reference_Show(var self,var output,int pos)73 int Reference_Show(var self, var output, int pos) {
74 return print_to(output, pos, "<'Reference' at 0x%p (%$)>", self, at(self,0));
75 }
76
77