10 typedef enum RopeType RopeType;
12 ROPETYPE_CONCATENATION,
17 typedef struct Concatenation Concatenation;
18 struct Concatenation {
24 typedef struct String String;
31 typedef union RopeInstance RopeInstance;
33 Concatenation concatenation;
38 volatile size_t referenceCount;
40 RopeInstance instance;
43 Rope* Rope_rereference(Rope* self) {
44 __sync_add_and_fetch(&(self->referenceCount), 1);
48 void Rope_destruct(Rope* self) {
49 size_t referenceCount = __sync_sub_and_fetch(&(self->referenceCount), 1);
51 if(referenceCount == 0) {
53 case ROPETYPE_CONCATENATION:
54 Rope_destruct(self->instance.concatenation.r0);
55 Rope_destruct(self->instance.concatenation.r1);
59 free(self->instance.string.characters);
70 void Rope_write(Rope*, Encoding, FILE) {
72 printf("Not implemented");
75 Rope* Rope_read(Encoding, FILE) {
77 printf("Not implemented");
81 Rope* Rope_concatenate(Rope* r0, Rope* r1) {
82 Rope* result = malloc(sizeof(Rope));
83 result->referenceCount = 0;
84 result->type = ROPETYPE_CONCATENATION;
85 result->instance.concatenation.r0 = Rope_rereference(r0);
86 result->instance.concatenation.r1 = Rope_rereference(r1);
90 __attribute__((pure)) size_t Rope_length(Rope* self) {
92 case ROPETYPE_CONCATENATION:
93 return Rope_length(self->instance.concatenation.r0) + Rope_length(self->instance.concatenation.r0);
95 return self->instance.string.length;