.. _basic-types: *********** Basic types *********** .. highlight:: c :: #include 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: .. toctree:: :maxdepth: 1 int128 net-addresses timestamps hash-values unique-ids Integral types ============== .. type:: bool A boolean. Where possible, we simply include ```` to get this type. It might be ``typedef``\ ed to ``int``\ . We also make sure that the following constants are defined: .. var:: bool false bool true .. type:: int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t Signed and unsigned, fixed-size integral types. .. type:: intptr_t uintptr_t Signed and unsigned integers that are guaranteed to be big enough to hold a type-cast ``void *``\ . .. type:: size_t An unsigned integer big enough to hold the size of a memory object, or a maximal array index. .. type:: ptrdiff_t A signed integer big enough to hold the difference between two pointers. Size macros =========== .. macro:: CORK_SIZEOF_SHORT CORK_SIZEOF_INT CORK_SIZEOF_LONG CORK_SIZEOF_POINTER The size (in bytes) of the ``short``, ``int``, ``long``, and ``void *`` types, respectively. .. _embedded-struct: Embedded ``struct``\ s ====================== 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 :c:type:`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``: .. function:: struct_type \*cork_container_of(field_type \*field, TYPE struct_type, FIELD field_name) 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``.