added assignment operator
This commit is contained in:
@@ -4,6 +4,10 @@
|
||||
#include <stdlib.h>
|
||||
#include "objects.h"
|
||||
|
||||
#if USING_VALGRIND
|
||||
#include <valgrind/memcheck.h>
|
||||
#endif
|
||||
|
||||
typedef struct OflowAlloc OflowAlloc;
|
||||
struct OflowAlloc {
|
||||
OflowAlloc *prev;
|
||||
@@ -38,11 +42,20 @@ Heap *Heap_New(int size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if USING_VALGRIND
|
||||
VALGRIND_CREATE_MEMPOOL(heap, 0, 0);
|
||||
#endif
|
||||
|
||||
return heap;
|
||||
}
|
||||
|
||||
void Heap_Free(Heap *heap)
|
||||
{
|
||||
|
||||
#if USING_VALGRIND
|
||||
VALGRIND_DESTROY_MEMPOOL(heap);
|
||||
#endif
|
||||
|
||||
while(heap->oflow)
|
||||
{
|
||||
OflowAlloc *prev = heap->oflow->prev;
|
||||
@@ -106,5 +119,9 @@ void *Heap_RawMalloc(Heap *heap, int size, Error *err)
|
||||
|
||||
assert(((intptr_t) addr) % 8 == 0);
|
||||
|
||||
#if USING_VALGRIND
|
||||
VALGRIND_MEMPOOL_ALLOC(heap, addr, size);
|
||||
#endif
|
||||
|
||||
return addr;
|
||||
}
|
||||
+4
-4
@@ -103,9 +103,9 @@ static Object *select(Object *self, Object *key, Heap *heap, Error *error)
|
||||
|
||||
assert(k >= 0);
|
||||
|
||||
if(Object_Compare(key, map->keys[i], error))
|
||||
if(Object_Compare(key, map->keys[k], error))
|
||||
// Found it!
|
||||
return map->vals[i];
|
||||
return map->vals[k];
|
||||
|
||||
if(error->occurred)
|
||||
// Key doesn't implement compare.
|
||||
@@ -230,11 +230,11 @@ static _Bool insert(Object *self, Object *key, Object *val, Heap *heap, Error *e
|
||||
{
|
||||
assert(k >= 0);
|
||||
|
||||
if(Object_Compare(key, map->keys[i], error))
|
||||
if(Object_Compare(key, map->keys[k], error))
|
||||
{
|
||||
// Already inserted.
|
||||
// Overwrite the value.
|
||||
map->vals[i] = val;
|
||||
map->vals[k] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ typedef struct {
|
||||
|
||||
static int hash(Object *self);
|
||||
static int count(Object *self);
|
||||
static Object *copy(Object *self, Heap *heap, Error *err);
|
||||
static _Bool op_eql(Object *self, Object *other);
|
||||
|
||||
static const Type t_string = {
|
||||
.base = (Object) { .type = &t_type, .flags = Object_STATIC },
|
||||
@@ -19,6 +21,8 @@ static const Type t_string = {
|
||||
.size = sizeof (StringObject),
|
||||
.hash = hash,
|
||||
.count = count,
|
||||
.copy = copy,
|
||||
.op_eql = op_eql,
|
||||
};
|
||||
|
||||
Object *Object_FromString(const char *str, int len, Heap *heap, Error *error)
|
||||
@@ -66,4 +70,27 @@ static int hash(Object *self)
|
||||
StringObject *strobj = (StringObject*) self;
|
||||
|
||||
return hashbytes((unsigned char*) strobj->body, strobj->size);
|
||||
}
|
||||
|
||||
static Object *copy(Object *self, Heap *heap, Error *err)
|
||||
{
|
||||
assert(self != NULL);
|
||||
assert(self->type == &t_string);
|
||||
assert(heap != NULL);
|
||||
assert(err != NULL);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static _Bool op_eql(Object *self, Object *other)
|
||||
{
|
||||
assert(self != NULL);
|
||||
assert(self->type == &t_string);
|
||||
assert(other != NULL);
|
||||
assert(other->type == &t_string);
|
||||
|
||||
StringObject *s1 = (StringObject*) self;
|
||||
StringObject *s2 = (StringObject*) other;
|
||||
|
||||
return s1->size == s2->size && !strncmp(s1->body, s2->body, s1->size);
|
||||
}
|
||||
+19
-15
@@ -49,7 +49,7 @@ unsigned int Object_GetDeepSize(const Object *obj, Error *err)
|
||||
|
||||
if(type->deepsize == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ int Object_Hash(Object *obj, Error *err)
|
||||
|
||||
if(type->hash == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ Object *Object_Copy(Object *obj, Heap *heap, Error *err)
|
||||
|
||||
if(type->copy == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ Object *Object_Call(Object *obj, Object **argv, unsigned int argc, Heap *heap, E
|
||||
|
||||
if(type->call == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -117,11 +117,11 @@ Object *Object_Select(Object *coll, Object *key, Heap *heap, Error *err)
|
||||
|
||||
if(type->select == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return type->select(coll, key, heap, err);
|
||||
return type->select(coll, key, heap, err);
|
||||
}
|
||||
|
||||
Object *Object_Delete(Object *coll, Object *key, Heap *heap, Error *err)
|
||||
@@ -135,7 +135,7 @@ Object *Object_Delete(Object *coll, Object *key, Heap *heap, Error *err)
|
||||
|
||||
if(type->delete == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ _Bool Object_Insert(Object *coll, Object *key, Object *val, Heap *heap, Error *e
|
||||
|
||||
if(type->insert == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ int Object_Count(Object *coll, Error *err)
|
||||
|
||||
if(type->count == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(coll), __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ Object *Object_Next(Object *iter, Heap *heap, Error *err)
|
||||
|
||||
if(type->next == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(iter), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(iter), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ Object *Object_Prev(Object *iter, Heap *heap, Error *err)
|
||||
|
||||
if(type->prev == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(iter), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(iter), __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ long long int Object_ToInt(Object *obj, Error *err)
|
||||
|
||||
if(type->to_int == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -271,7 +271,7 @@ _Bool Object_ToBool(Object *obj, Error *err)
|
||||
|
||||
if(type->to_bool == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -294,7 +294,7 @@ double Object_ToFloat(Object *obj, Error *err)
|
||||
|
||||
if(type->to_float == NULL)
|
||||
{
|
||||
Error_Report(err, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
Error_Report(err, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -303,12 +303,16 @@ double Object_ToFloat(Object *obj, Error *err)
|
||||
|
||||
_Bool Object_Compare(Object *obj1, Object *obj2, Error *error)
|
||||
{
|
||||
assert(obj1 != NULL);
|
||||
assert(obj2 != NULL);
|
||||
assert(error != NULL);
|
||||
|
||||
if(obj1->type != obj2->type)
|
||||
return 0;
|
||||
|
||||
if(obj1->type->op_eql == NULL)
|
||||
{
|
||||
Error_Report(error, "Object %s doesn't implement %s", Object_GetName(obj1), __func__);
|
||||
Error_Report(error, 0, "Object %s doesn't implement %s", Object_GetName(obj1), __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user