https://github.com/rufflewind/calico
Utility library for C.
https://github.com/rufflewind/calico
Last synced: about 2 months ago
JSON representation
Utility library for C.
- Host: GitHub
- URL: https://github.com/rufflewind/calico
- Owner: Rufflewind
- Created: 2016-04-05T09:43:28.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2021-09-04T22:12:22.000Z (almost 5 years ago)
- Last Synced: 2026-01-01T20:19:44.814Z (5 months ago)
- Language: C
- Homepage: https://rufflewind.com/calico
- Size: 297 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Calico
[![Build status][bi]][bl]
[bi]: https://github.com/Rufflewind/calico/actions/workflows/build.yml/badge.svg
[bl]: https://github.com/Rufflewind/calico/actions/workflows/build.yml
**Quick links**: [documentation](https://rufflewind.com/calico).
## Headers
**Note**: when including, all headers should be prefixed with `calico/`.
### Ordinary headers
- `arithmetic.h`: checked arithmetic and related utilities.
- `binary_search.h`: binary search algorithm.
- `frozen_btree.h`: immutable associative array using a frozen B-tree.
- `linear_ordered_search.h`: linear search through an ordered array.
- `macros.h`: utility macros.
- `math.h`: mathemtical utilities.
- `packed_arithmetic.h`: arithmetic of packed vectors.
- `shuffle.h`: random shuffle algorithm.
- `wclock.h`: monotonic wall clock.
### Template headers
- `btree_template.h` defines a B-tree data type and its associated
functions. It can be used as an associative array container (map). It
can also be used as a set, if the macro `Value` is left undefined.
### Compatibility headers
- `compat/alignas_begin.h` and `compat/alignas_end.h`: define `alignas` if
available. Otherwise, unless `RF_ALIGNAS_OPTIONAL` is defined, fail with
a preprocessor error.
- `compat/restrict_begin.h` and `compat/restrict_end.h`: define `restrict`
if available. Otherwise, fall back to nothing.
- `compat/inline_begin.h` and `compat/inline_end.h`: define `inline` if
available. Otherwise, fall back to `static`.
- `compat/noreturn_begin.h` and `compat/noreturn_end.h`: define `noreturn`
if available. Otherwise, fall back to nothing.
- `compat/restrict_begin.h` and `compat/restrict_end.h`: define `restrict`
if available. Otherwise, fall back to nothing.
- `compat/static_assert_begin.h` and `compat/static_assert_end.h`: define
`static_assert` if available. Otherwise, fall back to some trickery.
## Usage
### Template headers
Template headers are special C headers that can be included multiple times.
They generally expect some arguments, which are supplied through parameter
macros. As an example, consider the `btree_template.h` header, which can be
used like this:
~~~c
#include
#define Prefix foo
#define KeyType int
#define ValueType double
#include
~~~
The *associated header* `btree_head.h` *must be included at least once* before
any inclusions of the `btree_template.h` header. Including `btree_head.h`
more than once is unnecessary but not harmful either.
After including `btree_template.h`, the parameter macros (`Prefix`, `KeyType`,
and `ValueType`) are automatically undefined.
Typically, `Prefix` macro specifies the prefix that is attached to all
identifiers related to the template header. For example, the example above
causes the type `foo_btree` to be defined, as well as functions such as
`foo_btree_insert`.
### Scoped headers
These headers come in `*_begin.h` and `*_end.h` pairs. The purpose of such
headers is to minimize the risk of naming collisions, and hence it is a good
idea to keep the scope of these headers as small as possible to avoid clashing
with other headers. Nested inclusion of the same scoped headers is not
allowed.
Typical usage in a header file:
~~~c
#ifndef MY_INCLUDE_GUARD
#define MY_INCLUDE_GUARD
#include
/* other headers ... */
#include
#ifdef __cplusplus
extern "C" {
#endif
/* header code ... */
#ifdef __cplusplus
}
#endif
#include
#endif
~~~
In a non-header file (`.c` or `.cpp`), one can be more lenient and simply use
the `*_begin.h` without the corresponding `*_end.h`. For example:
~~~c
#include
/* other headers ... */
#include
/* source code ... */
~~~