#pragma once
#ifndef __AUTO_STATISTICS__
#define __AUTO_STATISTICS__
#include "AutoDefs.h"
namespace Auto {
class Statistics {
private:
volatile uint32_t _count; volatile usword_t _size; volatile usword_t _dirty_size; volatile usword_t _allocated; volatile usword_t _admin_size; volatile usword_t _small_medium_size; volatile usword_t _partial_gc_count; volatile usword_t _full_gc_count; volatile usword_t _stack_overflow_count; volatile usword_t _regions_in_use; volatile usword_t _subzones_in_use;
public:
Statistics() { reset(); }
inline usword_t count() const { return _count; }
inline usword_t size() const { return _size; }
inline usword_t dirty_size() const { return _dirty_size; }
inline usword_t admin_size() const { return _admin_size; }
inline usword_t allocated() const { return _allocated; }
inline usword_t unused() const { return _allocated - _size; }
inline usword_t small_medium_size() const { return _small_medium_size; }
inline usword_t large_size() const { return _size - _small_medium_size; }
inline usword_t partial_gc_count() const { return _partial_gc_count; }
inline usword_t full_gc_count() const { return _full_gc_count; }
inline usword_t stack_overflow_count() const { return _stack_overflow_count; }
inline usword_t regions_in_use() const { return _regions_in_use; }
inline usword_t subzones_in_use() const { return _subzones_in_use; }
inline void add_count(intptr_t n) { _count += n; }
inline void add_size(intptr_t size) { _size += size; }
inline void add_allocated(intptr_t allocated) { _allocated += allocated; }
inline void add_dirty(intptr_t size) { _dirty_size += size; }
inline void add_admin(intptr_t size) { _admin_size += size; }
inline void add_small_medium_size(intptr_t size) { _small_medium_size += _size; }
inline void increment_gc_count(bool is_partial) {
if (is_partial) _partial_gc_count++;
else _full_gc_count++;
}
inline void increment_stack_overflow_count() { _stack_overflow_count++; }
inline void increment_regions_in_use() { _regions_in_use++; }
inline void increment_subzones_in_use() { _subzones_in_use++; }
inline void reset() {
_count = 0;
_size = 0;
_dirty_size = 0;
_admin_size = 0;
_allocated = 0;
_small_medium_size = 0;
_partial_gc_count = 0;
_full_gc_count = 0;
_stack_overflow_count = 0;
_regions_in_use = 0;
_subzones_in_use = 0;
}
};
};
#endif // __AUTO_STATISTICS__