mcy / best

The Best Library: a C++ STL replacement
Apache License 2.0
165 stars 2 forks source link

best

The Best C++ Library

best is an "STL replacement" for C++20, in the spirit of projects like Abseil and Folly. However, unlike those, it aims to completely replace the C++ standard library and some of the language's own primitives.

Goals and Design Philosophy

Our goal is not interop, nor backwards compatibility: it is total replacement of 40 years of tech debt. best is what you use if you must use C++, but really hate the STL. Of course, you can use best alongside the standard library, and best depends on it for many things. But best encourages you to use its vocabulary types: you should pick the "best solution".

We will only support "reasonable" configurations: modern architectures, and operating systems whose names are "Linux", "Darwin", and "WindowsNT". best will be free-standing friendly where that is feasible.

best is not exception-friendly. Exceptions introduce performance pessimizations and safe exception-safe code in C++ is difficult to write and test. It will always require C++20 as a minimum, and will only ever support recent Clang and GCC; if you need to build for windows, use clang-cl.

NB: CI currently only tests recent Clang on x86_64-unknown-linux-glibc. If you want to bring up a new, reasonable platform, you should make sure to turn on some kind of CI support.

The essence of best's design philosophy is to copy Rust where it makes sense and to apply lessons learned from Abseil. Neither of these is obviously better, so we pick the best designs from each.

This is the best library in spite of C++, not because of it.

Name

The library is called best, styled in monospace. You do not need to write `best` in contexts where backticks are not interpreted as monospace markup.

The name comes from an unofficial synonym for Abseil's namespace, absl: "A Better Standard Library". Because much of this library is a response to Abseil, it feels right that it should be better than "better", and therefore best.

The best name is also an excellent opportunity for puns, and the names of important types and functions are chosen so that best::blah reads well. For example, best::option, best::result, and best::choice are all named with this convention in mind.

The best name is not intended to be braggadocious. I just think it's fun and punny.

Building

best currently only supports building with Bazel 7. It includes a script, ./bazel, that will download Bazelisk, and then download Bazel, and run that, ensuring the only build dependency is Bash. Bazel will download and install a hermetic Clang toolchain.

best will only have one source-of-truth build system. If you want to use best with CMake or a similar build system, you are on your own.

To run all of best's tests, simply run the following; you should not need to download any dependencies.

./bazel test //...

Organization

best's code is organized into shallow subdirectories that capture different pieces of functionality.

Contributing + Style

Bugfixes welcome, but this library is still under construction, so complex PRs will likely be rejected. If you need functionality, please open an issue instead.

The C++ code mostly follows Google's style guide, with a few changes:

Legal

best is made available to you under the terms of the Apache 2.0 license, the full text of which can be found in the LICENSE file. best also contains some algorithms copied from Rust's libstd, which is also Apache-2.0 licensed.

The authors of this work for the purposes of copyright are Miguel Young de la Sota and the Best Contributors (which is to say, anyone who contributes code or assets to be made available under the aforementioned license).