2019-06-18 18:43:28 +00:00
|
|
|
#ifndef __TRACYPRINT_HPP__
|
|
|
|
#define __TRACYPRINT_HPP__
|
|
|
|
|
2020-01-31 00:30:33 +00:00
|
|
|
#if ( defined _MSC_VER && _MSVC_LANG >= 201703L ) || __cplusplus >= 201703L
|
2020-01-31 17:09:25 +00:00
|
|
|
# if __has_include(<charconv>) && __has_include(<type_traits>)
|
|
|
|
# include <charconv>
|
|
|
|
# include <type_traits>
|
|
|
|
# else
|
|
|
|
# define NO_CHARCONV
|
|
|
|
# endif
|
2020-01-31 00:30:33 +00:00
|
|
|
#else
|
2020-01-31 17:09:25 +00:00
|
|
|
# define NO_CHARCONV
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef NO_CHARCONV
|
2020-01-31 00:30:33 +00:00
|
|
|
# include <stdio.h>
|
|
|
|
#endif
|
2020-01-31 00:19:08 +00:00
|
|
|
|
2020-01-31 01:26:38 +00:00
|
|
|
#include "../common/TracyForceInline.hpp"
|
|
|
|
|
2019-06-18 18:43:28 +00:00
|
|
|
namespace tracy
|
|
|
|
{
|
|
|
|
|
2020-01-31 01:26:38 +00:00
|
|
|
namespace detail
|
|
|
|
{
|
|
|
|
|
|
|
|
char* RealToStringGetBuffer();
|
|
|
|
|
|
|
|
static tracy_force_inline void RealToStringFloating( char* ptr, char* end )
|
|
|
|
{
|
|
|
|
if( *ptr == '-' ) ptr++;
|
|
|
|
const auto vbegin = ptr;
|
|
|
|
|
|
|
|
while( *ptr != '\0' && *ptr != '.' ) ptr++;
|
|
|
|
auto sz = end - ptr + 1;
|
|
|
|
|
|
|
|
while( ptr - vbegin > 3 )
|
|
|
|
{
|
|
|
|
ptr -= 3;
|
|
|
|
memmove( ptr+1, ptr, sz+3 );
|
|
|
|
*ptr = ',';
|
|
|
|
sz += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
while( *ptr != '\0' && *ptr != '.' ) ptr++;
|
|
|
|
if( *ptr == '\0' ) return;
|
|
|
|
|
|
|
|
while( *ptr != '\0' ) ptr++;
|
|
|
|
ptr--;
|
|
|
|
while( *ptr == '0' ) ptr--;
|
|
|
|
if( *ptr != '.' && *ptr != ',' ) ptr++;
|
|
|
|
*ptr = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
static tracy_force_inline void RealToStringInteger( char* buf, char* end )
|
|
|
|
{
|
|
|
|
if( *buf == '-' ) buf++;
|
|
|
|
auto ptr = end;
|
|
|
|
auto sz = 1;
|
|
|
|
while( ptr - buf > 3 )
|
|
|
|
{
|
|
|
|
ptr -= 3;
|
|
|
|
memmove( ptr+1, ptr, sz+3 );
|
|
|
|
*ptr = ',';
|
|
|
|
sz += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-01-31 00:19:08 +00:00
|
|
|
template<typename T>
|
|
|
|
static inline char* PrintFloat( char* begin, char* end, T value, int precision )
|
|
|
|
{
|
2020-01-31 17:09:25 +00:00
|
|
|
#ifndef NO_CHARCONV
|
2020-01-31 00:30:33 +00:00
|
|
|
return std::to_chars( begin, end, value, std::chars_format::fixed, precision ).ptr;
|
|
|
|
#else
|
2020-01-31 00:19:08 +00:00
|
|
|
return begin + sprintf( begin, "%.*f", precision, value );
|
2020-01-31 00:30:33 +00:00
|
|
|
#endif
|
2020-01-31 00:19:08 +00:00
|
|
|
}
|
|
|
|
|
2020-01-31 00:44:38 +00:00
|
|
|
template<typename T>
|
|
|
|
static inline char* PrintFloat( char* begin, char* end, T value )
|
|
|
|
{
|
2020-01-31 17:09:25 +00:00
|
|
|
#ifndef NO_CHARCONV
|
2020-01-31 00:44:38 +00:00
|
|
|
return std::to_chars( begin, end, value, std::chars_format::fixed ).ptr;
|
|
|
|
#else
|
|
|
|
return begin + sprintf( begin, "%f", value );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2020-01-31 17:09:25 +00:00
|
|
|
#ifndef NO_CHARCONV
|
2020-01-31 01:26:38 +00:00
|
|
|
template<typename T>
|
|
|
|
static inline const char* RealToString( T val )
|
|
|
|
{
|
|
|
|
auto buf = detail::RealToStringGetBuffer();
|
|
|
|
auto end = std::to_chars( buf, buf+64, val ).ptr;
|
|
|
|
*end = '\0';
|
|
|
|
if constexpr ( std::is_integral_v<T> )
|
|
|
|
{
|
|
|
|
detail::RealToStringInteger( buf, end );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
detail::RealToStringFloating( buf, end );
|
|
|
|
}
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
static inline const char* RealToString( double val )
|
|
|
|
{
|
|
|
|
auto buf = detail::RealToStringGetBuffer();
|
|
|
|
const auto sz = sprintf( buf, "%f", val );
|
|
|
|
detail::RealToStringFloating( buf, buf+sz );
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-06-18 18:43:28 +00:00
|
|
|
const char* TimeToString( int64_t ns );
|
|
|
|
const char* MemSizeToString( int64_t val );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|