29#ifndef PX_PROFILE_DATA_PARSING_H
30#define PX_PROFILE_DATA_PARSING_H
32#include "foundation/Px.h"
34namespace physx {
namespace profile {
56 template<
typename TDataType>
inline TDataType convert() { PX_ASSERT(
false );
return TDataType(); }
58 template<
typename TDataType>
59 inline void convert(
const TDataType& ) {}
62 template<>
inline uint8_t BlockParserDataConverter::convert<uint8_t>() {
return mU8[0]; }
63 template<>
inline uint16_t BlockParserDataConverter::convert<uint16_t>() {
return mU16[0]; }
64 template<>
inline uint32_t BlockParserDataConverter::convert<uint32_t>() {
return mU32[0]; }
65 template<>
inline uint64_t BlockParserDataConverter::convert<uint64_t>() {
return mU64[0]; }
66 template<>
inline int8_t BlockParserDataConverter::convert<int8_t>() {
return mI8[0]; }
67 template<>
inline int16_t BlockParserDataConverter::convert<int16_t>() {
return mI16[0]; }
68 template<>
inline int32_t BlockParserDataConverter::convert<int32_t>() {
return mI32[0]; }
69 template<>
inline int64_t BlockParserDataConverter::convert<int64_t>() {
return mI64[0]; }
70 template<>
inline float BlockParserDataConverter::convert<float>() {
return mF32[0]; }
71 template<>
inline double BlockParserDataConverter::convert<double>() {
return mF64[0]; }
73 template<>
inline void BlockParserDataConverter::convert<uint8_t>(
const uint8_t& inData ) { mU8[0] = inData; }
74 template<>
inline void BlockParserDataConverter::convert<uint16_t>(
const uint16_t& inData ) { mU16[0] = inData; }
75 template<>
inline void BlockParserDataConverter::convert<uint32_t>(
const uint32_t& inData ) { mU32[0] = inData; }
76 template<>
inline void BlockParserDataConverter::convert<uint64_t>(
const uint64_t& inData ) { mU64[0] = inData; }
77 template<>
inline void BlockParserDataConverter::convert<int8_t>(
const int8_t& inData ) { mI8[0] = inData; }
78 template<>
inline void BlockParserDataConverter::convert<int16_t>(
const int16_t& inData ) { mI16[0] = inData; }
79 template<>
inline void BlockParserDataConverter::convert<int32_t>(
const int32_t& inData ) { mI32[0] = inData; }
80 template<>
inline void BlockParserDataConverter::convert<int64_t>(
const int64_t& inData ) { mI64[0] = inData; }
81 template<>
inline void BlockParserDataConverter::convert<float>(
const float& inData ) { mF32[0] = inData; }
82 template<>
inline void BlockParserDataConverter::convert<double>(
const double& inData ) { mF64[0] = inData; }
88 template<u
int8_t ByteCount>
89 static inline void swapBytes( uint8_t* inData )
91 for ( uint32_t idx = 0; idx < ByteCount/2; ++idx )
93 uint32_t endIdx = ByteCount-idx-1;
94 uint8_t theTemp = inData[idx];
95 inData[idx] = inData[endIdx];
96 inData[endIdx] = theTemp;
100 static inline bool checkLength(
const uint8_t* inStart,
const uint8_t* inStop, uint32_t inLength )
102 return static_cast<uint32_t
>(inStop - inStart) >= inLength;
106 static inline T val(T v) {
return v;}
108 template<
bool DoSwapBytes,
typename TDataType>
109 static inline bool parse(
const uint8_t*& inStart,
const uint8_t* inStop, TDataType& outData )
111 if ( checkLength( inStart, inStop,
sizeof( TDataType ) ) )
114 for ( uint32_t idx =0; idx <
sizeof( TDataType ); ++idx )
115 theConverter.mU8[idx] = inStart[idx];
116 if ( val(DoSwapBytes))
117 swapBytes<sizeof(TDataType)>( theConverter.mU8 );
118 outData = theConverter.convert<TDataType>();
119 inStart +=
sizeof( TDataType );
125 template<
bool DoSwapBytes,
typename TDataType>
126 static inline bool parseBlock(
const uint8_t*& inStart,
const uint8_t* inStop, TDataType* outData, uint32_t inNumItems )
128 uint32_t desired =
sizeof(TDataType)*inNumItems;
129 if ( checkLength( inStart, inStop, desired ) )
131 if ( val(DoSwapBytes) )
133 for ( uint32_t item = 0; item < inNumItems; ++item )
136 for ( uint32_t idx =0; idx <
sizeof( TDataType ); ++idx )
137 theConverter.mU8[idx] = inStart[idx];
138 swapBytes<sizeof(TDataType)>( theConverter.mU8 );
139 outData[item] = theConverter.convert<TDataType>();
140 inStart +=
sizeof(TDataType);
145 uint8_t* target =
reinterpret_cast<uint8_t*
>(outData);
146 memmove( target, inStart, desired );
155 template<
bool DoSwapBytes,
typename TDataType>
156 static inline bool parseBlock( uint8_t*& inStart,
const uint8_t* inStop, uint32_t inNumItems )
158 uint32_t desired =
sizeof(TDataType)*inNumItems;
159 if ( checkLength( inStart, inStop, desired ) )
161 if ( val(DoSwapBytes) )
163 for ( uint32_t item = 0; item < inNumItems; ++item, inStart +=
sizeof( TDataType ) )
164 swapBytes<sizeof(TDataType)>( inStart );
167 inStart +=
sizeof( TDataType ) * inNumItems;
175 template<
bool DoSwapBytes>
178 const uint8_t* mBegin;
180 BlockParser(
const uint8_t* inBegin=NULL,
const uint8_t* inEnd=NULL )
185 inline bool hasMoreData()
const {
return mBegin != mEnd; }
186 inline bool checkLength( uint32_t inLength ) {
return BlockParseFunctions::checkLength( mBegin, mEnd, inLength ); }
188 template<
typename TDataType>
189 inline bool read( TDataType& outDatatype ) {
return BlockParseFunctions::parse<DoSwapBytes>( mBegin, mEnd, outDatatype ); }
191 template<
typename TDataType>
192 inline bool readBlock( TDataType* outDataPtr, uint32_t inNumItems ) {
return BlockParseFunctions::parseBlock<DoSwapBytes>( mBegin, mEnd, outDataPtr, inNumItems ); }
194 template<
typename TDataType>
195 inline bool readBlock( uint32_t inNumItems )
197 uint8_t* theTempPtr =
const_cast<uint8_t*
>(mBegin);
198 bool retval = BlockParseFunctions::parseBlock<DoSwapBytes, TDataType>( theTempPtr, mEnd, inNumItems );
203 uint32_t amountLeft()
const {
return static_cast<uint32_t
>( mEnd - mBegin ); }
207 template<
typename TDataType,
typename TBlockParserType>
208 inline TDataType blockParserRead( TBlockParserType& inType )
211 inType.read( retval );
uint64 uint64_t
Definition fwd.hpp:145
int8 int8_t
Definition fwd.hpp:43
int64 int64_t
Definition fwd.hpp:85
int32 int32_t
Definition fwd.hpp:71
int16 int16_t
Definition fwd.hpp:57
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
Definition PxProfileDataParsing.h:87
Definition PxProfileDataParsing.h:38
Definition PxProfileDataParsing.h:177