/** \page page_spa_design SPA Design

# Conventions

## Types

Types are generally divided into two categories:

- String types: They identify interfaces and highlevel object types.
- integer types: These are enumerations used in the parts where high
                 performance/ease of use/low space overhead is needed.

The SPA type is system is statis and very simple but still allows you
to make and introspect complex object type hierarchies.

See the type system docs for more info.

## Error codes

SPA uses negative integers as errno style error codes. Functions that return an
int result code generated an error when < 0. `spa_strerror()` can be used to
get a string representation of the error code.

SPA also has a way to encode asynchronous results. This is done by setting a
high bit (bit 30, the `ASYNC_BIT`) in the result code and a sequence number
in the lower bits. This result is normally identified as a positive success
result code and the sequence number can later be matched to the completion
event.

## Useful macros

SPA comes with some useful macros defined in `<spa/utils/defs.h>` and a
number of utility functions, see \ref spa_utils

*/
