aboutsummaryrefslogtreecommitdiff

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_create
  • FancyThings_push_back
  • FancyThings_push_front
  • FancyThings_pop_back
  • FancyThings_pop_front
  • FancyThings_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_create
  • FancyTable_free
  • FancyTable_insert
  • FancyTable_find
  • ...

And other data structures follow similar patterns.