src/lib/object.h
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 174 src/object.h@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
#ifndef OBJECT_H
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define OBJECT_H
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/**
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * @file
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 *
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * The thing feared by every C-programmer - calling C structs "objects".
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include <stdbool.h>
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
/**
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
 * Basic object type info
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
struct object_type {
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    /** Parent type for nested structs, NULL if the parent is object_type */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    const struct object_type *parent;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
};
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
/**
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 * Basic object state
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
struct object {
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    /** Object's type */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    const struct object_type *type;
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
};
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
/**
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
 * Initialize an object to the given type.
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
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
    31
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
 * Check that the given object type is compatible with the given type.
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
 */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
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
    36
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
 * Check that the given object "implements" the given type.
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
 */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
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
    41
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
 * Return the given object as a pointer suitable for casting to the struct for the given type.
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
 *
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
 * It is a bug to call this with an object that's not compatible with the given type.
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
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
    48
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
/**
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
 * Return a pointer to the object's type that is compatible with the given type.
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 *
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
 * It is a bug to call this with a object that's not compatible with the given type.
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 */
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
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
    55
c56680e9e021 implement a generic object/object-type thing
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
#endif /* OBJECT_H */