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