bbai-kernel is a modern C++ library with components for reflection and building allocator aware types.
It is a small piece of the project bbai that provides algorithms for deterministic objective Bayesian analysis.
- How to Implement Reflection With an Inline Macro
- How to Build an Allocator-aware Smart Pointer
- How to Make Your C++ Code Faster With Extended Stack Space
- How to Compose Allocator-aware Types
#include <array>
#include <cassert>
#include <iostream>
#include <memory_resource>
#include "bbai/memory/management/managed_ptr.h"
#include "bbai/memory/management/managed_ptr_utility.h"
struct A {
virtual ~A() noexcept = default;
virtual int f() const noexcept = 0;
};
struct B final : public A {
explicit B(int xx) : x{xx} {}
int x;
int f() const noexcept override { return x; }
};
int main() {
std::array<char, 100> buffer;
std::pmr::monotonic_buffer_resource resource{static_cast<void*>(buffer.data()),
buffer.size()};
bbai::memmg::managed_ptr<A> ptr1{&resource};
// we configure ptr1 to allocate into buffer
std::pmr::polymorphic_allocator<> alloc;
bbai::memmg::managed_ptr<A> ptr2 =
bbai::memmg::allocate_managed<B>(alloc, 123);
// ptr2 manages memory from the heap
ptr1 = std::move(ptr2);
// because the two pointers have unequal allocators, the assignment will
// reallocate memory and move construct an instance of B into buffer
std::cout << (reinterpret_cast<char*>(ptr1.get()) == buffer.data()) << "\n";
// prints 1
std::cout << ptr1->f() << std::endl; // prints 123
return 0;
}