Evan Nemerson

Open Source Projects

An incomplete list of open-source projects I am, or have been involved with, in no particular order. Unless otherwise noted, I'm the original author and current maintainer.

SIMDe

SIMDe provides portable implementations of intrinsics for SIMD ISA extensions, allowing you to to run code written for an ISA extension (such as SSE) on a machine which does not support it, such as an ARM CPU, or just an x86 CPU without that specific ISA extension. There is no performance penalty for using SIMDe instead of using the native intrinsics directly if the CPU supports it.

SIMDe currently implements several thousand functions from various x86 APIs, NEON, SVE, and WASM SIMD128. Please see the project for an up-to-date list.

Hedley

Hedley is a personal favorite. It is a C/C++ header you can include in your project to enable compiler specific features while maintaining compatibility, with a focus on making your API harder to misuse by providing hints to compilers and static analyzers.

When I start a C project these days, adding Hedley is usually the first thing I do.

WAV

WAV is an alternative to the WASM SIMD128 C API (wasm_simd128.h), with a focus on safety and usability. It aims to be easy to use correctly and hard to use incorrectly without sacrificing performance. It's a small project, but lots of fun.

portable-snippets

An assortment portable code snippets (in C, though they also work in C++) for various tasks which are typically compiler-specific or platform-specific.

Modules currently include:

  • builtin — use compiler built-ins/intrinsics if available, otherwise fall back on standard C implementations. Provides both accelerated ond portable implementations of both GCC and MSVC built-ins/intrinsics, as well fixed-length versions. Sort of like SIMDe for scalar code.
  • safe-math — fast, portable, overflow-safe integer math functions.
  • clock — cross-platform wall clock, CPU time, and monotonic time.
  • cpu — runtime CPU feature detection for x86 and Arm.
  • debug-trap — debugging traps and assertions.
  • endian — the most complete endianness detection and swapping code I'm aware of.
  • exact-int — exact-width integer types (think <stdint.h>, but more portable). Hopefully no longer necessary.
  • once — one-time initialization.
  • atomic — common atomic synchronization operations (load, store, add, subtract, CAS).
  • random — random number generation (3 flavors: cryptographic, reproducible, and fast)

All modules work on Linux, Windows, OS X, BSD, Solaris, etc., on all architectures I've been able to test. Most should work on any C89+ compliant compiler, though they can also take advantage of specific compilers/platforms.

Squash

Squash is primarily an abstraction layer which provides a single API to access many compression libraries. This allows applications a great deal of flexibility in which choosing a compression algorithm, or allowing a choice between several of them.

The actual integration with individual compression libraries is done through plugins which can be installed separately from Squash itself and are not loaded until they are required. This allows Squash consumers to utilize many compression algorithms without rewriting code or unnecessary bloat.

In addition to a permissively licensed (MIT) library, Squash provides some generic tools which use the library for common tasks. Currently, this includes a command-line interface similar to gzip, bzip2, xz, etc. called squash and a benchmarking tool. There is also a web-based benchmark, and a project to fuzz various compression libraries.

µnit

µnit is a small and portable testing framework for C which includes pretty much everything you might expect from a C testing framework, plus a few pleasant surprises, wrapped in a nice API.

I still really like the API and the feature set, but it could use a rewrite; the implementation is a bit of a mess.

TinyCThread

TinyCThread is a cross-platform implementation of the C11 threading API which uses POSIX threads (pthreads) or the Windows API, allowing you to use the standard C11 API on systems which don’t natively support it.

This was initially created by Marcus Geelnard, I finished implementing the API and took over maintenance.

Vala

Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.

Vala was created by Jürg Billeter. I maintained the bindings to third-party libraries (which effectively formed the standard library) for several years.

Bump

Bump is a library designed to make asynchronous programming easy by providing high-level data structures for concurrency management, including multi-threading and main loop callbacks, in GObject/GIO based projects, especially those written in Vala.

SQLHeavy

SQLHeavy is a wrapper on top of SQLite with a GObject-based interface, providing very nice APIs for C and Vala, GObject Introspection support, and additional functionality not present in SQLite.

configure-cmake

An autotools-style configure script for CMake-based projects.

Salieri

Compatibility header so you can compile code using SAL annotations with compilers other than MSVC.