diff --git a/client/TracyFastVector.hpp b/client/TracyFastVector.hpp new file mode 100644 index 00000000..f0757dfe --- /dev/null +++ b/client/TracyFastVector.hpp @@ -0,0 +1,88 @@ +#ifndef __TRACYFASTVECTOR_HPP__ +#define __TRACYFASTVECTOR_HPP__ + +#include + +#include "../common/TracyAlloc.hpp" +#include "../common/TracyForceInline.hpp" + +namespace tracy +{ + +template +class FastVector +{ +public: + using iterator = T*; + using const_iterator = const T*; + + FastVector( size_t capacity ) + : m_ptr( (T*)tracy_malloc( sizeof( T ) * capacity ) ) + , m_size( 0 ) + , m_capacity( capacity ) + { + } + + FastVector( const FastVector& ) = delete; + FastVector( FastVector&& ) = delete; + + ~FastVector() + { + tracy_free( m_ptr ); + } + + FastVector& operator=( const FastVector& ) = delete; + FastVector& operator=( FastVector&& ) = delete; + + bool empty() const { return m_size == 0; } + size_t size() const { return m_size; } + + T* data() { return m_ptr; } + const T* data() const { return m_ptr; }; + + T* begin() { return m_ptr; } + const T* begin() const { return m_ptr; } + T* end() { return m_ptr + m_size; } + const T* end() const { return m_ptr + m_size; } + + T& front() { assert( m_size > 0 ); return m_ptr[0]; } + const T& front() const { assert( m_size > 0 ); return m_ptr[0]; } + + T& back() { assert( m_size > 0 ); return m_ptr[m_size - 1]; } + const T& back() const { assert( m_size > 0 ); return m_ptr[m_size - 1]; } + + T& operator[]( size_t idx ) { return m_ptr[idx]; } + const T& operator[]( size_t idx ) const { return m_ptr[idx]; } + + T* push_next() + { + T* ret; + if( m_size == m_capacity ) AllocMore(); + ret = m_ptr + m_size; + m_size++; + return ret; + } + + void clear() + { + m_size = 0; + } + +private: + tracy_no_inline void AllocMore() + { + m_capacity *= 2; + T* ptr = (T*)tracy_malloc( sizeof( T ) * m_capacity ); + memcpy( ptr, m_ptr, m_size * sizeof( T ) ); + tracy_free( m_ptr ); + m_ptr = ptr; + } + + T* m_ptr; + size_t m_size; + size_t m_capacity; +}; + +} + +#endif