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;
}