khanat-opennel-code/code/nel/include/nel/misc/stream_inline.h

349 lines
8.3 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_STREAM_INLINE_H
#define NL_STREAM_INLINE_H
#include "types_nl.h"
#include "debug.h"
#include <cstdio>
namespace NLMISC
{
// ======================================================================================================
// ======================================================================================================
// IBasicStream Inline Implementation.
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
inline IStream::IStream(bool inputStream)
{
_InputStream= inputStream;
_XML = false;
resetPtrTable();
}
// ======================================================================================================
inline bool IStream::isReading() const
{
return _InputStream;
}
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
// ======================================================================================================
inline void IStream::serial(uint8 &b)
{
serialBuffer((uint8 *)&b, 1);
}
// ======================================================================================================
inline void IStream::serial(sint8 &b)
{
serialBuffer((uint8 *)&b, 1);
}
// ======================================================================================================
inline void IStream::serial(uint16 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 2);
#else // NL_LITTLE_ENDIAN
uint16 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 2);
NLMISC_BSWAP16(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP16(v);
serialBuffer((uint8 *)&v, 2);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(sint16 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 2);
#else // NL_LITTLE_ENDIAN
uint16 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 2);
NLMISC_BSWAP16(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP16(v);
serialBuffer((uint8 *)&v, 2);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(uint32 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 4);
#else // NL_LITTLE_ENDIAN
uint32 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 4);
NLMISC_BSWAP32(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP32(v);
serialBuffer((uint8 *)&v, 4);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(sint32 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 4);
#else // NL_LITTLE_ENDIAN
uint32 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 4);
NLMISC_BSWAP32(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP32(v);
serialBuffer((uint8 *)&v, 4);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(uint64 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 8);
#else // NL_LITTLE_ENDIAN
uint64 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 8);
NLMISC_BSWAP64(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP64(v);
serialBuffer((uint8 *)&v, 8);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(sint64 &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 8);
#else // NL_LITTLE_ENDIAN
uint64 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 8);
NLMISC_BSWAP64(v);
b=v;
}
else
{
v=b;
NLMISC_BSWAP64(v);
serialBuffer((uint8 *)&v, 8);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(float &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 4);
#else // NL_LITTLE_ENDIAN
uint32 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 4);
NLMISC_BSWAP32(v);
b=*((float*)&v);
}
else
{
v=*((uint32*)&b);
NLMISC_BSWAP32(v);
serialBuffer((uint8 *)&v, 4);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(double &b)
{
#ifdef NL_LITTLE_ENDIAN
serialBuffer((uint8 *)&b, 8);
#else // NL_LITTLE_ENDIAN
uint64 v;
if(isReading())
{
serialBuffer((uint8 *)&v, 8);
NLMISC_BSWAP64(v);
b=*((double*)&v);
}
else
{
v=*((uint64*)&b);
NLMISC_BSWAP64(v);
serialBuffer((uint8 *)&v, 8);
}
#endif // NL_LITTLE_ENDIAN
}
// ======================================================================================================
inline void IStream::serial(bool &b)
{
serialBit(b);
}
#ifndef NL_OS_CYGWIN
// ======================================================================================================
inline void IStream::serial(char &b)
{
serialBuffer((uint8 *)&b, 1);
}
#endif
// ======================================================================================================
inline void IStream::serial(std::string &b)
{
uint32 len=0;
// Read/Write the length.
if(isReading())
{
serial(len);
// check stream holds enough bytes (avoid STL to crash on resize)
checkStreamSize(len);
b.resize(len);
}
else
{
len= uint32(b.size());
if (len>1000000)
throw NLMISC::EInvalidDataStream( "IStream: Trying to write a string of %u bytes", len );
serial(len);
}
/*
// Read/Write the string.
for(sint i=0;i<len;i++)
serial(b[i]);
*/
if (len > 0)
serialBuffer((uint8*)(&(b[0])), len);
}
// ======================================================================================================
inline void IStream::serial(ucstring &b)
{
uint32 len=0;
// Read/Write the length.
if(isReading())
{
serial(len);
// check stream holds enough bytes (avoid STL to crash on resize)
checkStreamSize(len);
b.resize(len);
}
else
{
len= uint32(b.size());
if (len>1000000)
throw NLMISC::EInvalidDataStream( "IStream: Trying to write an ucstring of %u bytes", len );
serial(len);
}
// Read/Write the string.
for(uint i=0;i!=len;++i)
serial(b[i]);
}
// ======================================================================================================
inline uint8 IStream::serialBitField8(uint8 bf)
{
serial(bf);
return bf;
}
// ======================================================================================================
inline uint16 IStream::serialBitField16(uint16 bf)
{
serial(bf);
return bf;
}
// ======================================================================================================
inline uint32 IStream::serialBitField32(uint32 bf)
{
serial(bf);
return bf;
}
}
#endif // NL_STREAM_INLINE_H
/* End of stream_inline.h */