pmr/tracker.hpp

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

// raw code

#include <iostream>
#include <string>
#include <memory_resource>

class Tracker : public std::pmr::memory_resource
{
private:
  std::pmr::memory_resource* upstream;  // wrapped memory resource
  std::string prefix{};
public:
  // we wrap the passed or default resource:
  explicit Tracker(std::pmr::memory_resource* us
                    = std::pmr::get_default_resource())
   : upstream{us} {
  }
  explicit Tracker(std::string p,
                   std::pmr::memory_resource* us
                    = std::pmr::get_default_resource())
   : upstream{us}, prefix{std::move(p)} {
  }
private:
  void* do_allocate(size_t bytes, size_t alignment) override {
    std::cout << prefix << "allocate " << bytes << " Bytes\n";
    void* ret = upstream->allocate(bytes, alignment);
    return ret;
  }
  void do_deallocate(void* ptr, size_t bytes, size_t alignment) override {
    std::cout << prefix << "deallocate " << bytes << " Bytes\n";
    upstream->deallocate(ptr, bytes, alignment);
  }
  bool do_is_equal(const std::pmr::memory_resource& other) const noexcept
   override {
    // same object?:
    if (this == &other) return true;
    // same type and prefix and equal upstream?:
    auto op = dynamic_cast<const Tracker*>(&other);
    return op != nullptr && op->prefix == prefix
            && upstream->is_equal(other);
  }
};