#ifndef __TRACYSLAB_HPP__ #define __TRACYSLAB_HPP__ #include #include #include #include "TracyMemory.hpp" #include "../public/common/TracyForceInline.hpp" namespace tracy { template class Slab { public: Slab() : m_ptr( new char[BlockSize] ) , m_offset( 0 ) , m_buffer( { m_ptr } ) , m_usage( BlockSize ) { memUsage += BlockSize; } ~Slab() { memUsage -= m_usage; for( auto& v : m_buffer ) { delete[] v; } } tracy_force_inline void* AllocRaw( size_t size ) { assert( size <= BlockSize ); const auto offset = m_offset; if( offset + size > BlockSize ) { return DoAlloc( size ); } else { void* ret = m_ptr + offset; m_offset += size; return ret; } } template tracy_force_inline T* AllocInit() { const auto size = sizeof( T ); auto ret = AllocRaw( size ); new( ret ) T; return (T*)ret; } template tracy_force_inline T* AllocInit( size_t sz ) { const auto size = sizeof( T ) * sz; auto ret = AllocRaw( size ); T* ptr = (T*)ret; for( size_t i=0; i tracy_force_inline T* Alloc() { return (T*)AllocRaw( sizeof( T ) ); } template tracy_force_inline T* Alloc( size_t size ) { return (T*)AllocRaw( sizeof( T ) * size ); } tracy_force_inline void Unalloc( size_t size ) { assert( size <= m_offset ); m_offset -= size; } tracy_force_inline void* AllocBig( size_t size ) { const auto offset = m_offset; if( offset + size <= BlockSize ) { void* ret = m_ptr + offset; m_offset += size; return ret; } else if( size <= BlockSize && BlockSize - offset <= 1024 ) { return DoAlloc( size ); } else { memUsage += size; m_usage += size; auto ret = new char[size]; m_buffer.emplace_back( ret ); return ret; } } void Reset() { if( m_buffer.size() > 1 ) { memUsage -= m_usage - BlockSize; m_usage = BlockSize; for( int i=1; i m_buffer; size_t m_usage; }; } #endif