inplace_vector
is a dynamically-resizable array with capacity fixed at compile time and contiguous inplace storage, that is, the array elements are stored within the vector object itself. Its API closely resemblesstd::vector<T, A>
, making it easy to teach and learn, and the inplace storage guarantee makes it useful in environments in which dynamic memory allocations are undesired.
#include <array>
#include <cassert>
#include <beman/inplace_vector/inplace_vector.hpp>
using namespace beman::inplace_vector;
/**
* Generates fibonacci sequence using inplace_vector.
* See: https://en.wikipedia.org/wiki/Fibonacci_sequence
*/
template <int Capacity> inplace_vector<int, Capacity> fibonacci_to(int num) {
assert(num < Capacity);
inplace_vector<int, Capacity> vec;
constexpr static std::array<int, 2> first_two{0, 1};
for (auto i = 0; i <= num; ++i) {
auto new_val = i < 2 ? first_two[i] : vec[i - 1] + vec[i - 2];
vec.push_back(new_val);
}
return vec;
}
Building this repository requires C++17 or later.
TODO: tested platforms.
# Configure build
$ cmake -S . -B build -DCMAKE_CXX_STANDARD=20
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /.../inplace_vector/build
# Build
$ cmake --build build
[ 50%] Building CXX object src/beman/inplace_vector/tests/CMakeFiles/beman.inplace_vector.test.dir/inplace_vector.test.cpp.o
[100%] Linking CXX executable beman.inplace_vector.test
[100%] Built target beman.inplace_vector.test
# Run tests
$ ctest --test-dir build/
Internal ctest changing into directory: /.../inplace_vector/build
Test project /.../inplace_vector/build
Start 1: beman.inplace_vector.test
1/1 Test #1: beman.inplace_vector.test ........ Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.01 sec
This project use pre-commit framework for linting.
pip3 install pre-commit
pre-commit can be configured to automatically triggered before git commit, to install this functionality, run:
pre-commit install
pre-commit run --all-files
This will download and check linting rules on all files.
Apart from Markdown files,
pre-commit
will automatically format the files
to conform with linting rules in place.