#include "optick.config.h" #if USE_OPTICK #include "optick_common.h" #include "optick_serialization.h" namespace Optick { string OutputDataStream::GetData() { flush(); return str(); } OutputDataStream & OutputDataStream::Write(const char * buffer, size_t size) { write(buffer, size); return *this; } OutputDataStream OutputDataStream::Empty; OutputDataStream &operator << ( OutputDataStream &stream, const char* val ) { uint32 length = val == nullptr ? 0 : (uint32)strlen(val); stream << length; if (length > 0) { stream.write( val, length ); } return stream; } OutputDataStream &operator << ( OutputDataStream &stream, int val ) { stream.write( (char*)&val, sizeof(int) ); return stream; } OutputDataStream &operator << ( OutputDataStream &stream, int64 val ) { stream.write( (char*)&val, sizeof(int64) ); return stream; } OutputDataStream &operator << ( OutputDataStream &stream, char val ) { stream.write( (char*)&val, sizeof(char) ); return stream; } OutputDataStream &operator << (OutputDataStream &stream, int8 val) { stream.write((char*)&val, sizeof(val)); return stream; } OutputDataStream &operator << ( OutputDataStream &stream, byte val ) { stream.write( (char*)&val, sizeof(byte) ); return stream; } OutputDataStream & operator<<(OutputDataStream &stream, uint64 val) { stream.write( (char*)&val, sizeof(uint64) ); return stream; } OutputDataStream & operator<<(OutputDataStream &stream, uint32 val) { stream.write( (char*)&val, sizeof(uint32) ); return stream; } OutputDataStream & operator<<(OutputDataStream &stream, float val) { stream.write((char*)&val, sizeof(float)); return stream; } OutputDataStream & operator<<(OutputDataStream &stream, const string& val) { stream << (uint32)val.length(); if (!val.empty()) stream.write(&val[0], sizeof(val[0]) * val.length()); return stream; } OutputDataStream & operator<<(OutputDataStream &stream, const wstring& val) { size_t count = val.length() * sizeof(wchar_t); stream << (uint32)count; if (!val.empty()) stream.write((char*)(&val[0]), count); return stream; } InputDataStream &operator >> (InputDataStream &stream, int16 &val) { stream.read((char*)&val, sizeof(int16)); return stream; } InputDataStream &operator >> ( InputDataStream &stream, int32 &val ) { stream.read( (char*)&val, sizeof(int) ); return stream; } InputDataStream &operator >> ( InputDataStream &stream, int64 &val ) { stream.read( (char*)&val, sizeof(int64) ); return stream; } InputDataStream & operator>>( InputDataStream &stream, byte &val ) { stream.read( (char*)&val, sizeof(byte) ); return stream; } InputDataStream & operator >> (InputDataStream &stream, uint16 &val) { stream.read((char*)&val, sizeof(uint16)); return stream; } InputDataStream & operator>>( InputDataStream &stream, uint32 &val ) { stream.read( (char*)&val, sizeof(uint32) ); return stream; } InputDataStream & operator>>( InputDataStream &stream, uint64 &val ) { stream.read( (char*)&val, sizeof(uint64) ); return stream; } InputDataStream & operator >> ( InputDataStream &stream, string &val) { int32 length = 0; stream >> length; val.resize(length + 1); stream.read( (char*)&val[0], length); return stream; } InputDataStream::InputDataStream() : stringstream( ios_base::in | ios_base::out ) { } void InputDataStream::Append(const char *buffer, size_t length) { write( buffer, length ); } size_t InputDataStream::Length() { return (size_t)(tellp() - tellg()); } bool InputDataStream::Skip(size_t length) { bool result = Length() <= length; seekg(length, ios_base::cur); return result; } } #endif //USE_OPTICK