#pragma once #ifndef PROGRAMCOMMON_SERIALIZE_STREAM_H #define PROGRAMCOMMON_SERIALIZE_STREAM_H //================================================================================================== /// SerializeStream class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 2. 13 @purpose - SCStream¸¦ »ó¼Ó¹Þ¾Æ ºÎ¸ðÀÇ ÀÎÅÍÆäÀ̽º¸¦ À¯ÁöÇϸ鼭 ¿©·¯ ½ºÆ®¸² µ¥ÀÌÅ͸¦ ó¸®ÇϱâÀ§Çؼ­ template class·Î Á¦ÀÛ @note - @history - 10/08/04|waverix|change to no template to support easy debugging the use case of a SCStream has a SerializeStream only based on a case study (f100804.5L) */ //================================================================================================== #include "SCStream.h" template class SerializeStream : public SCStream { //BOOST_STATIC_ASSERT((boost::is_same::value)); public: typedef STREAM_TYPE_ ReferenceArray[STREAM_NUM_]; SerializeStream() : SCStream(STREAM_NUM_, reinterpret_cast(0)) , kReferenceArray(reinterpret_cast(*stream_)) { } virtual ~SerializeStream() { } // // 0 <= position < number_of_items virtual bool IsEmpty(int position) const; // const ReferenceArray& kReferenceArray; }; //================================================================================================== template bool SerializeStream::IsEmpty(int position) const { if (&kReferenceArray != reinterpret_cast(stream_)) { __debugbreak(); // invalid reference access return true; // problem point, a custom logic returns true. }; if (position >= 0 && position < number_of_items_) { return kReferenceArray[position].Part.IsValid() == false; } assert(!"Index out of range"); return true; } /* // (f100804.5L) removed template< class STREAM_TYPE, BYTE STREAM_NUM > class SerializeStream : public SCStream { public: SerializeStream(){} ~SerializeStream(void){} virtual BOOL IsEmpty( POSTYPE AtPos ) { if( AtPos>STREAM_NUM ) return TRUE; return ( FALSE == m_pStream[AtPos].Part.IsValid() ); } virtual VOID Clear() { memset( m_pStream, 0, sizeof(STREAM_TYPE)*STREAM_NUM ); } virtual void Serialize( POSTYPE pos, BYTE * pStream, eSERIALIZE eType ) { if( eType == SERIALIZE_STORE ) { ASSERT( !IsBadReadPtr( pStream, sizeof(STREAM_TYPE) ) ); memcpy( &m_pStream[pos], pStream, sizeof(STREAM_TYPE) ); } else if( eType == SERIALIZE_LOAD ) { ASSERT( !IsBadWritePtr( pStream, sizeof(STREAM_TYPE) ) ); memcpy( pStream, &m_pStream[pos], sizeof(STREAM_TYPE) ); } } virtual VOID Serialize( BYTE * pStream, WORD wSize, eSERIALIZE eType ) { ASSERT( wSize == sizeof(STREAM_TYPE)*STREAM_NUM ); if( eType == SERIALIZE_STORE ) memcpy( m_pStream, pStream, wSize ); else if( eType == SERIALIZE_LOAD ) memcpy( pStream, m_pStream, wSize ); } virtual BYTE GetMaxSlotNum() { return STREAM_NUM; } virtual BYTE * GetStreamPtr() { return (BYTE *)m_pStream; } virtual BYTE * GetStreamPtr(BYTE pos) { return (BYTE *)&m_pStream[pos]; } private: STREAM_TYPE m_pStream[STREAM_NUM]; }; */ #endif //PROGRAMCOMMON_SERIALIZE_STREAM_H