59 #ifndef _RESOURCE_TRACKER_HPP_ 60 #define _RESOURCE_TRACKER_HPP_ 65 #include <forward_list> 93 template <
typename Res>
100 using map_type = std::map<res_type, resource_tracker_item>;
103 resource_tracker (
const char *name,
bool enabled, std::size_t max_resources,
const char *res_name,
104 unsigned max_reuse = 1);
111 void increment (
const char *filename,
const int line,
const res_type &res,
unsigned use_count = 1);
115 void decrement (
const res_type &res,
unsigned use_count = 1);
119 void push_track (
void);
121 void pop_track (
void);
123 void clear_all (
void);
130 void dump (
void)
const;
131 void dump_map (
const map_type &map, std::ostream &out)
const;
132 unsigned get_total_use_count (
void)
const;
177 template <
typename Res>
179 const char *res_name,
unsigned max_reuse )
181 , m_res_alias (res_name)
182 , m_enabled (enabled)
183 , m_is_aborted (false)
184 , m_max_resources (max_resources)
185 , m_resource_count (0)
186 , m_max_reuse (max_reuse)
192 template <
typename Res>
202 template <
typename Res>
235 auto inserted = map.emplace (std::piecewise_construct, std::forward_as_tuple (res),
236 std::forward_as_tuple (filename, line, use_count));
251 inserted.first->second.m_reuse_count += use_count;
257 template <
typename Res>
279 auto tracked = map.find (res);
280 if (tracked == map.end ())
288 if (use_count > tracked->second.m_reuse_count)
297 tracked->second.m_reuse_count -= use_count;
298 if (tracked->second.m_reuse_count == 0)
308 template <
typename Res>
316 for (
auto map_it : stack_it)
318 total += map_it.second.m_reuse_count;
324 template <
typename Res>
331 template <
typename Res>
343 template <
typename Res>
350 template <
typename Res>
354 std::stringstream out;
357 out <<
" +--- " <<
m_name << std::endl;
360 std::size_t level = 0;
363 out <<
" +--- stack_level = " << level << std::endl;
371 template <
typename Res>
375 for (
auto map_it : map)
377 out <<
" +--- tracked " <<
m_res_alias <<
"=" << map_it.first;
378 out <<
" " << map_it.second;
381 out <<
" +--- tracked " <<
m_res_alias <<
" count = " << map.size () << std::endl;
384 template <
typename Res>
403 template <
typename Res>
448 #if !defined (NDEBUG) 462 #endif // _RESOURCE_TRACKER_HPP_ std::size_t m_max_resources
resource_tracker_item(const char *fn_arg, int l_arg, unsigned reuse)
void restrack_set_suppress_assert(bool suppress)
void restrack_log(const std::string &str)
void dump_map(const map_type &map, std::ostream &out) const
std::map< res_type, resource_tracker_item > map_type
void restrack_set_error(bool error)
bool restrack_pop_error(void)
map_type & get_current_map(void)
void increment(const char *filename, const int line, const res_type &res, unsigned use_count=1)
resource_tracker(const char *name, bool enabled, std::size_t max_resources, const char *res_name, unsigned max_reuse=1)
unsigned get_total_use_count(void) const
void decrement(const res_type &res, unsigned use_count=1)
fileline_location m_first_location
std::size_t m_resource_count
void restrack_assert(bool cond)
bool restrack_is_assert_suppressed(void)
std::ostream & operator<<(std::ostream &os, const fileline_location &fileline)
std::forward_list< map_type > m_tracked_stack