Type-safe Generic Algorithms and Data Structures for C
- Generic red-black tree
- Generic vector
- Generic linked-list
- Generic priority queue
- Generic Hash Table
- Generic quick sort
- Augmented red-black tree
- Murmur Hash
- String utilities
Build & Install
make
make install
Run Tests
make test
Quickstart
For example, if you have a custom type FancyThing, and you want a linked list of FancyThings. Just add LIST_DEF_AS(FancyThing, FancyThings) to the header file, and LIST_IMPL_AS(FancyThing, FancyThings) to a source file, and you get a new type FancyThings, and many functions for free:
FancyThings_createFancyThings_push_backFancyThings_push_frontFancyThings_pop_backFancyThings_pop_frontFancyThings_pop_front- ...
And if you want a hash table with FancyThing as key, and a integer as value. First, define and implement 2 functions:
uint64_t FancyThing_hash(FancyThing self)bool FancyThing_eq(FancyThing a, FancyThing b)
These functions just act like how typeclass/trait/concept works in Haskell/Rust/C++. And we provide mmhash to help you build FancyThing_hash.
Then you can add HASH_TABLE_DEF_AS(FancyThing, Int, FancyTable) to the header file, and HASH_TABLE_IMPL_AS(FancyThing, Int, FancyTable) to a source file. Then you get a new type FancyTable and its functions:
FancyTable_createFancyTable_freeFancyTable_insertFancyTable_find- ...
And other data structures follow similar patterns.
