Tenno is a replacement for the C++23 standard library, providing light constexpr and thread-safe containers, algorithms and data structures for your projects. You can expect most of the apis to be similar to the ones in the standard library.
Tenno is implemented as a header only library, meaning that you can just include the files under the include directory in your project, or you can just copy-paste the ones that you need.
- values are returned as
optionalorexpectedinstead of raising exceptions - heavy support for constexpr functions and data structures
- thread-safe data structures
- modern-looking c++ code
- performance
The library officially supports all GCC compilers starting from gcc-8.5.0. Constexpr functions are guaranteed to work from c++20 onward.
- tenno::array<T,N>
- tenno::expected<T,E>
- tenno::range<T>
- tenno::error
- tenno::atomic<T>
- tenno::mutex
- tenno::lock_guard<T>
- tenno::optional<T>
- tenno::shared_ptr<T>
- tenno::copy<It1,It2,F>
- tenno::for_each<It1,It2,F>
- tenno::accumulate<It1,It2,T>
- tenno::swap<T>
- tenno::move<T>
- tenno::make_shared<T, Deleter, Alloc>
- tenno::allocate_shared<T, Alloc>
- tenno::unique_ptr<T>
- tenno::make_unique<\T>
- tenno::jthread
- tenno::weak_ptr<T>
- tenno::allocator<T>
- tenno::default_delete<T>
- tenno::vector<T>
- tenno::reference_wrapper
- tenno::uniform_real_distribution
- tenno::deque: TODO
- tenno::stack: TODO
- tenno::map: TODO
- tenno::unordered_map: TODO
- tenno::mdspan: TODO
- tenno::thread pool: TODO
The library uses valFuzz for testing
./build/tenno_tests # run tests
./build/tenno_tests --fuzz # run fuzzer
./build/tenno_tests --benchmark # run benchmarksThe library uses doxygen for documentation, to build the html documentation run:
make docs
tenno implements compile-time random number generation through the
uniform_real_distribution() and the random_array() functions,
enabling you to use random numbers in constexpr algorithms.
tenno::array<T,N>.at(n) returns expected<T,E> with either the
value or a tenno::error with the error out_of_range if the range
specified is bigger than the size of the array.
tenno::vector<T>.at(n)returnsexpected<T,E>tenno::vector<T>.front()returnexpected<const T&,E>tenno::vector<T>.back()returnsexpected<const T&,E>