From 654f54d877fd0098b52e31066b3d42b7ac72b2e9 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sat, 2 Nov 2019 15:32:40 +0100 Subject: [PATCH] Add short pointer class, storing 6 bytes. --- profiler/build/win32/Tracy.vcxproj | 1 + profiler/build/win32/Tracy.vcxproj.filters | 3 + server/TracyShortPtr.hpp | 78 ++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 server/TracyShortPtr.hpp diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj index 192efb88..58d4a338 100644 --- a/profiler/build/win32/Tracy.vcxproj +++ b/profiler/build/win32/Tracy.vcxproj @@ -170,6 +170,7 @@ + diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters index 393a035c..70182910 100644 --- a/profiler/build/win32/Tracy.vcxproj.filters +++ b/profiler/build/win32/Tracy.vcxproj.filters @@ -296,6 +296,9 @@ server + + server + diff --git a/server/TracyShortPtr.hpp b/server/TracyShortPtr.hpp new file mode 100644 index 00000000..c3f78f98 --- /dev/null +++ b/server/TracyShortPtr.hpp @@ -0,0 +1,78 @@ +#ifndef __TRACYSHORTPTR_HPP__ +#define __TRACYSHORTPTR_HPP__ + +#include +#include +#include + +#include "../common/TracyForceInline.hpp" + +namespace tracy +{ + +#if UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF +template +class short_ptr +{ +public: + tracy_force_inline short_ptr() {} + tracy_force_inline short_ptr( T* ptr ) { Set( ptr ); } + + tracy_force_inline operator T*() { return Get(); } + tracy_force_inline operator const T*() const { return Get(); } + tracy_force_inline T& operator*() { return *Get(); } + tracy_force_inline const T& operator*() const { return *Get(); } + tracy_force_inline T* operator->() { return Get(); } + tracy_force_inline const T* operator->() const { return Get(); } + +private: + tracy_force_inline void Set( T* ptr ) + { + assert( ( uint64_t( ptr ) & 0xFFFF000000000000 ) == 0 ); + memcpy( m_ptr, &ptr, 4 ); + memcpy( m_ptr+4, ((char*)&ptr)+4, 2 ); + } + + tracy_force_inline T* Get() + { + uint32_t lo; + uint16_t hi; + memcpy( &lo, m_ptr, 4 ); + memcpy( &hi, m_ptr+4, 2 ); + return (T*)( uint64_t( lo ) | ( ( uint64_t( hi ) << 32 ) ) ); + } + + tracy_force_inline const T* Get() const + { + uint32_t lo; + uint16_t hi; + memcpy( &lo, m_ptr, 4 ); + memcpy( &hi, m_ptr+4, 2 ); + return (T*)( uint64_t( lo ) | ( ( uint64_t( hi ) << 32 ) ) ); + } + + uint8_t m_ptr[6]; +}; +#else +template +class short_ptr +{ +public: + tracy_force_inline short_ptr() {} + tracy_force_inline short_ptr( T* ptr ) : m_ptr( ptr ) {} + + tracy_force_inline operator T*() { return m_ptr; } + tracy_force_inline operator const T*() const { return m_ptr; } + tracy_force_inline T& operator*() { return *m_ptr; } + tracy_force_inline const T& operator*() const { return *m_ptr; } + tracy_force_inline T* operator->() { return m_ptr; } + tracy_force_inline const T* operator->() const { return m_ptr; } + +private: + T* m_ptr; +}; +#endif + +} + +#endif