src/lib/object.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 174 src/object.c@c56680e9e021
permissions -rw-r--r--
nexus.c compiles
174
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "object.h"
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <stdlib.h>
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <assert.h>
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
void object_init (struct object *obj, const struct object_type *type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
{
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    // trip on bugs
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    assert(!obj->type);
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    // set type
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    obj->type = type;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
}
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
bool object_type_check (const struct object_type *obj_type, const struct object_type *type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
{
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    const struct object_type *t;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    // sanity-check
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    assert(obj_type && type);
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    // look for a matching type in the type's inheritance tree
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    for (t = obj_type; t; t = t->parent)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        if (t == type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
            break;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    // t will be (parent == NULL) if we didn't find any matching type
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    return (t != NULL);    
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
}
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
bool object_check (struct object *obj, const struct object_type *type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
{
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    // sanity check
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    assert(obj && type);
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    return object_type_check(obj->type, type);
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
}
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
void* object_cast (struct object *obj, const struct object_type *type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
{
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    assert(object_type_check(obj->type, type));
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    // ok, return as void*
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    return obj;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
}
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
const void* object_type (struct object *obj, const struct object_type *type)
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
{
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    assert(object_type_check(obj->type, type));
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // ok, return as void*
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    return obj->type;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
}