The open source OpenXR runtime
at main 118 lines 2.7 kB view raw
1#ifndef __TRACYFASTVECTOR_HPP__ 2#define __TRACYFASTVECTOR_HPP__ 3 4#include <assert.h> 5#include <stddef.h> 6 7#include "../common/TracyAlloc.hpp" 8#include "../common/TracyForceInline.hpp" 9 10namespace tracy 11{ 12 13template<typename T> 14class FastVector 15{ 16public: 17 using iterator = T*; 18 using const_iterator = const T*; 19 20 FastVector( size_t capacity ) 21 : m_ptr( (T*)tracy_malloc( sizeof( T ) * capacity ) ) 22 , m_write( m_ptr ) 23 , m_end( m_ptr + capacity ) 24 { 25 assert( capacity != 0 ); 26 } 27 28 FastVector( const FastVector& ) = delete; 29 FastVector( FastVector&& ) = delete; 30 31 ~FastVector() 32 { 33 tracy_free( m_ptr ); 34 } 35 36 FastVector& operator=( const FastVector& ) = delete; 37 FastVector& operator=( FastVector&& ) = delete; 38 39 bool empty() const { return m_ptr == m_write; } 40 size_t size() const { return m_write - m_ptr; } 41 42 T* data() { return m_ptr; } 43 const T* data() const { return m_ptr; }; 44 45 T* begin() { return m_ptr; } 46 const T* begin() const { return m_ptr; } 47 T* end() { return m_write; } 48 const T* end() const { return m_write; } 49 50 T& front() { assert( !empty() ); return m_ptr[0]; } 51 const T& front() const { assert( !empty() ); return m_ptr[0]; } 52 53 T& back() { assert( !empty() ); return m_write[-1]; } 54 const T& back() const { assert( !empty() ); return m_write[-1]; } 55 56 T& operator[]( size_t idx ) { return m_ptr[idx]; } 57 const T& operator[]( size_t idx ) const { return m_ptr[idx]; } 58 59 T* push_next() 60 { 61 if( m_write == m_end ) AllocMore(); 62 return m_write++; 63 } 64 65 T* prepare_next() 66 { 67 if( m_write == m_end ) AllocMore(); 68 return m_write; 69 } 70 71 void commit_next() 72 { 73 m_write++; 74 } 75 76 void clear() 77 { 78 m_write = m_ptr; 79 } 80 81 void swap( FastVector& vec ) 82 { 83 const auto ptr1 = m_ptr; 84 const auto ptr2 = vec.m_ptr; 85 const auto write1 = m_write; 86 const auto write2 = vec.m_write; 87 const auto end1 = m_end; 88 const auto end2 = vec.m_end; 89 90 m_ptr = ptr2; 91 vec.m_ptr = ptr1; 92 m_write = write2; 93 vec.m_write = write1; 94 m_end = end2; 95 vec.m_end = end1; 96 } 97 98private: 99 tracy_no_inline void AllocMore() 100 { 101 const auto cap = size_t( m_end - m_ptr ) * 2; 102 const auto size = size_t( m_write - m_ptr ); 103 T* ptr = (T*)tracy_malloc( sizeof( T ) * cap ); 104 memcpy( ptr, m_ptr, size * sizeof( T ) ); 105 tracy_free_fast( m_ptr ); 106 m_ptr = ptr; 107 m_write = m_ptr + size; 108 m_end = m_ptr + cap; 109 } 110 111 T* m_ptr; 112 T* m_write; 113 T* m_end; 114}; 115 116} 117 118#endif