coro/tracingpmr.hpp

The following code example is taken from the book
C++23 - The Complete Guide by Nicolai M. Josuttis, Leanpub, 2026
The code is licensed under a Creative Commons Attribution 4.0 International License. Creative Commons License

// raw code

#include <iostream>
#include <generator>
#include <memory_resource>

// PMR memory resource that traces allocations
class TracingPMR : public std::pmr::memory_resource
{
  std::pmr::memory_resource* upstream;  // wrapped memory resource
public:
  // we wrap the passed or the default resource:
  explicit TracingPMR(std::pmr::memory_resource* us
                       = std::pmr::get_default_resource())
   : upstream{us} {
  }
private:
  // trace allocations:
  void* do_allocate(std::size_t bytes, std::size_t alignment) override {
    std::cout << "allocate " << bytes << " Bytes\n";    // trace
    void* ret = upstream->allocate(bytes, alignment);   // delegate to upstream
    return ret;
  }

  // trace deallocations:
  void do_deallocate(void* ptr, std::size_t bytes, std::size_t alignment) override {
    std::cout << "deallocate " << bytes << " Bytes\n";  // trace
    upstream->deallocate(ptr, bytes, alignment);        // delegate to upstream
  }

  // interchangeability of objects of this resource type:
  bool do_is_equal(const std::pmr::memory_resource& r2) const noexcept override {
    return this == &r2 ||                                    // same object or
           (dynamic_cast<const TracingPMR*>(&r2) != nullptr  // same type and
             && upstream->is_equal(r2));                     // same upstream
  }
};