#include <libcork/core.h>
The types in this section ensure that the C99 integer types are available, regardless of platform. We also define some preprocessor macros that give the size of the non-fixed-size standard types. In addition, libcork defines some useful low-level types:
A boolean. Where possible, we simply include <stdbool.h> to get this type. It might be typedefed to int. We also make sure that the following constants are defined:
Signed and unsigned, fixed-size integral types.
Signed and unsigned integers that are guaranteed to be big enough to hold a type-cast void *.
An unsigned integer big enough to hold the size of a memory object, or a maximal array index.
A signed integer big enough to hold the difference between two pointers.
Quite often a callback function or API will take in a pointer to a particular struct, with the expectation that you can embed that struct into some other type for extension purposes. Kind of a bastardized subclassing mechanism for C code. The doubly-linked list module is a perfect example; you’re meant to embed cork_dllist_item within the linked list element type. You can use the following macro to obtain the pointer to the containing (“subclass”) struct, when given a pointer to the contained (“superclass”) struct:
The struct_type parameter must be the name of a struct type, field_name must be the name of some field within that struct, and field must be a pointer to an instance of that field. The macro returns a pointer to the containing struct. So, given the following definitions:
struct superclass {
int a;
};
struct subclass {
int b;
struct superclass parent;
};
struct subclass instance;
then the following identity holds:
cork_container_of(&instance.parent, struct subclass, parent) == &instance
Note
When the superclass struct appears as the first element of the subclass struct, you can obtain the same effect using a simple type-cast. However, the cork_container_of macro is more robust, since it also works when the superclass struct appears later on in the subclass struct.