tracked_memory_resource.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef ENTT_COMMON_TRACKED_MEMORY_RESOURCE_HPP
  2. #define ENTT_COMMON_TRACKED_MEMORY_RESOURCE_HPP
  3. #include <version>
  4. #if defined(__cpp_lib_memory_resource) && __cpp_lib_memory_resource >= 201603L
  5. # define ENTT_HAS_TRACKED_MEMORY_RESOURCE
  6. #
  7. # include <cstddef>
  8. # include <memory_resource>
  9. # include <string>
  10. namespace test {
  11. class tracked_memory_resource: public std::pmr::memory_resource {
  12. void *do_allocate(std::size_t bytes, std::size_t alignment) override {
  13. ++alloc_counter;
  14. return std::pmr::get_default_resource()->allocate(bytes, alignment);
  15. }
  16. void do_deallocate(void *value, std::size_t bytes, std::size_t alignment) override {
  17. ++dealloc_counter;
  18. std::pmr::get_default_resource()->deallocate(value, bytes, alignment);
  19. }
  20. bool do_is_equal(const std::pmr::memory_resource &other) const noexcept override {
  21. return (this == &other);
  22. }
  23. public:
  24. using string_type = std::pmr::string;
  25. using size_type = std::size_t;
  26. static constexpr const char *default_value = "a string long enough to force an allocation (hopefully)";
  27. tracked_memory_resource()
  28. : alloc_counter{},
  29. dealloc_counter{} {}
  30. size_type do_allocate_counter() const noexcept {
  31. return alloc_counter;
  32. }
  33. size_type do_deallocate_counter() const noexcept {
  34. return dealloc_counter;
  35. }
  36. void reset() noexcept {
  37. alloc_counter = 0u;
  38. dealloc_counter = 0u;
  39. }
  40. private:
  41. size_type alloc_counter;
  42. size_type dealloc_counter;
  43. };
  44. } // namespace test
  45. #endif
  46. #endif