//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // // Utilities for serialization/unserialization buffer //=============================================================================// #ifndef UTLBUFFERUTIL_H #define UTLBUFFERUTIL_H #ifdef _WIN32 #pragma once #endif #include "tier1/utlvector.h" #include "tier1/utlbuffer.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- class Vector2D; class Vector; class Vector4D; class QAngle; class Quaternion; class VMatrix; class Color; class CUtlBinaryBlock; class CUtlString; class CUtlCharConversion; //----------------------------------------------------------------------------- // For string serialization, set the delimiter rules //----------------------------------------------------------------------------- void SetSerializationDelimiter( CUtlCharConversion *pConv ); void SetSerializationArrayDelimiter( const char *pDelimiter ); //----------------------------------------------------------------------------- // Standard serialization methods for basic types //----------------------------------------------------------------------------- bool Serialize( CUtlBuffer &buf, const bool &src ); bool Unserialize( CUtlBuffer &buf, bool &dest ); bool Serialize( CUtlBuffer &buf, const int &src ); bool Unserialize( CUtlBuffer &buf, int &dest ); bool Serialize( CUtlBuffer &buf, const float &src ); bool Unserialize( CUtlBuffer &buf, float &dest ); bool Serialize( CUtlBuffer &buf, const Vector2D &src ); bool Unserialize( CUtlBuffer &buf, Vector2D &dest ); bool Serialize( CUtlBuffer &buf, const Vector &src ); bool Unserialize( CUtlBuffer &buf, Vector &dest ); bool Serialize( CUtlBuffer &buf, const Vector4D &src ); bool Unserialize( CUtlBuffer &buf, Vector4D &dest ); bool Serialize( CUtlBuffer &buf, const QAngle &src ); bool Unserialize( CUtlBuffer &buf, QAngle &dest ); bool Serialize( CUtlBuffer &buf, const Quaternion &src ); bool Unserialize( CUtlBuffer &buf, Quaternion &dest ); bool Serialize( CUtlBuffer &buf, const VMatrix &src ); bool Unserialize( CUtlBuffer &buf, VMatrix &dest ); bool Serialize( CUtlBuffer &buf, const Color &src ); bool Unserialize( CUtlBuffer &buf, Color &dest ); bool Serialize( CUtlBuffer &buf, const CUtlBinaryBlock &src ); bool Unserialize( CUtlBuffer &buf, CUtlBinaryBlock &dest ); bool Serialize( CUtlBuffer &buf, const CUtlString &src ); bool Unserialize( CUtlBuffer &buf, CUtlString &dest ); //----------------------------------------------------------------------------- // You can use this to check if a type serializes on multiple lines //----------------------------------------------------------------------------- template< class T > inline bool SerializesOnMultipleLines() { return false; } template< > inline bool SerializesOnMultipleLines() { return true; } template< > inline bool SerializesOnMultipleLines() { return true; } //----------------------------------------------------------------------------- // Vector serialization //----------------------------------------------------------------------------- template< class T > bool Serialize( CUtlBuffer &buf, const CUtlVector &src ) { extern const char *s_pUtlBufferUtilArrayDelim; int nCount = src.Count(); if ( !buf.IsText() ) { buf.PutInt( nCount ); for ( int i = 0; i < nCount; ++i ) { ::Serialize( buf, src[i] ); } return buf.IsValid(); } if ( !SerializesOnMultipleLines() ) { buf.PutChar('\n'); for ( int i = 0; i < nCount; ++i ) { ::Serialize( buf, src[i] ); if ( s_pUtlBufferUtilArrayDelim && (i != nCount-1) ) { buf.PutString( s_pUtlBufferUtilArrayDelim ); } buf.PutChar('\n'); } } else { for ( int i = 0; i < nCount; ++i ) { ::Serialize( buf, src[i] ); if ( s_pUtlBufferUtilArrayDelim && (i != nCount-1) ) { buf.PutString( s_pUtlBufferUtilArrayDelim ); } buf.PutChar(' '); } } return buf.IsValid(); } template< class T > bool Unserialize( CUtlBuffer &buf, CUtlVector &dest ) { dest.RemoveAll(); MEM_ALLOC_CREDIT_FUNCTION(); if ( !buf.IsText() ) { int nCount = buf.GetInt(); if ( nCount ) { dest.EnsureCapacity( nCount ); for ( int i = 0; i < nCount; ++i ) { VerifyEquals( dest.AddToTail(), i ); if ( !::Unserialize( buf, dest[i] ) ) return false; } } return buf.IsValid(); } while ( true ) { buf.EatWhiteSpace(); if ( !buf.IsValid() ) break; int i = dest.AddToTail( ); if ( ! ::Unserialize( buf, dest[i] ) ) return false; } return true; } #endif // UTLBUFFERUTIL_H