76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
#include "../defs.h"
|
|
#include "objects.h"
|
|
|
|
static void walk(Object *self, void (*callback)(Object **referer, void *userp), void *userp);
|
|
static void print(Object *self, FILE *fp);
|
|
static bool istypeof(Object *self, Object *other, Heap *heap, Error *error);
|
|
|
|
typedef struct {
|
|
Object base;
|
|
Object *items[2];
|
|
} SumObject;
|
|
|
|
static TypeObject t_sum = {
|
|
.base = (Object) { .type = &t_type, .flags = Object_STATIC },
|
|
.name = TYPENAME_SUM,
|
|
.size = sizeof(SumObject),
|
|
.init = NULL,
|
|
.free = NULL,
|
|
.hash = NULL,
|
|
.copy = NULL,
|
|
.call = NULL,
|
|
.print = print,
|
|
|
|
.select = NULL,
|
|
.delete = NULL,
|
|
.insert = NULL,
|
|
.count = NULL,
|
|
|
|
.istypeof = istypeof,
|
|
|
|
.op_eql = NULL,
|
|
.walk = walk,
|
|
.walkexts = NULL,
|
|
};
|
|
|
|
TypeObject *Object_GetSumType()
|
|
{
|
|
return &t_sum;
|
|
}
|
|
|
|
Object *Object_NewSum(Object *item0, Object *item1, Heap *heap, Error *error)
|
|
{
|
|
SumObject *sum = (SumObject*) Heap_Malloc(heap, &t_sum, error);
|
|
if (sum != NULL) {
|
|
sum->items[0] = item0;
|
|
sum->items[1] = item1;
|
|
}
|
|
return (Object*) sum;
|
|
}
|
|
|
|
static bool
|
|
istypeof(Object *self,
|
|
Object *other,
|
|
Heap *heap,
|
|
Error *error)
|
|
{
|
|
SumObject *sum = (SumObject*) self;
|
|
return Object_IsTypeOf(sum->items[0], other, heap, error)
|
|
|| Object_IsTypeOf(sum->items[1], other, heap, error);
|
|
}
|
|
|
|
static void walk(Object *self, void (*callback)(Object **referer, void *userp), void *userp)
|
|
{
|
|
SumObject *sum = (SumObject*) self;
|
|
callback(sum->items + 0, userp);
|
|
callback(sum->items + 1, userp);
|
|
}
|
|
|
|
static void print(Object *self, FILE *fp)
|
|
{
|
|
SumObject *sum = (SumObject*) self;
|
|
Object_Print(sum->items[0], fp);
|
|
fprintf(fp, " | ");
|
|
Object_Print(sum->items[1], fp);
|
|
}
|