/*---------------------------------------------------------------------------* Project: NintendoWare File: ut_BinaryReader.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision:$ *---------------------------------------------------------------------------*/ #ifndef NW_UT_BINARYREADER_H_ #define NW_UT_BINARYREADER_H_ #include #include namespace nw { namespace ut { //--------------------------------------------------------------------------- //! @brief メモリ上のバイト列を扱うStreamクラスです。 //--------------------------------------------------------------------------- class MemoryStream { public: MemoryStream( void* start = NULL, void* end = NULL ) : m_StartAddress( start ), m_EndAddress( end ), m_CurrentAddress( start ) { } //! 現在のアドレスをセットします void SetCurrentAddress( void* address ) { m_CurrentAddress = address; } //! 現在のアドレスを返します void* GetCurrentAddress() const { return m_CurrentAddress; } // [TODO] ASSERT で止める? //! @brief アドレスを移動します //! //! 移動が成功したら ture, 失敗したら false を返します bool MoveAddress( int size ) { void* tmp = (void*)( (int)m_CurrentAddress + size ); if ( tmp < m_StartAddress ) { return false; } else if ( tmp > m_EndAddress ) { return false; } else { m_CurrentAddress = tmp; return true; } } private: void* m_StartAddress; void* m_EndAddress; void* m_CurrentAddress; }; #define NW_UT_DEFINE_READ_NORMAL_FUNC(TYPE,NAME) \ TYPE Read##NAME( const TYPE value ) const \ { \ return value; \ } \ TYPE Read##NAME() \ { \ TYPE* x = static_cast( m_pStream->GetCurrentAddress() ); \ m_pStream->MoveAddress( sizeof(TYPE) ); \ return *x; \ } #define NW_UT_DEFINE_READ_REVERSE_FUNC(TYPE,NAME) \ TYPE Read##NAME( const TYPE value ) const \ { \ return Endian::BSwap(value); \ } \ TYPE Read##NAME() \ { \ TYPE* x = static_cast( m_pStream->GetCurrentAddress() ); \ m_pStream->MoveAddress( sizeof(TYPE) ); \ return Endian::BSwap(*x); \ } //--------------------------------------------------------------------------- //! @brief バイナリデータをそのまま読むリーダークラスです。 //--------------------------------------------------------------------------- class BinaryNormalReader { public: #if defined( NW_ENABLE_FLOAT64 ) NW_UT_DEFINE_READ_NORMAL_FUNC(f64,F64) #endif NW_UT_DEFINE_READ_NORMAL_FUNC(s64,S64) NW_UT_DEFINE_READ_NORMAL_FUNC(u64,U64) NW_UT_DEFINE_READ_NORMAL_FUNC(f32,F32) NW_UT_DEFINE_READ_NORMAL_FUNC(s32,S32) NW_UT_DEFINE_READ_NORMAL_FUNC(u32,U32) NW_UT_DEFINE_READ_NORMAL_FUNC(s16,S16) NW_UT_DEFINE_READ_NORMAL_FUNC(u16,U16) NW_UT_DEFINE_READ_NORMAL_FUNC(s8,S8) NW_UT_DEFINE_READ_NORMAL_FUNC(u8,U8) BinaryNormalReader( MemoryStream* stream = NULL ) : m_pStream( stream ) {} void SetStream( MemoryStream* stream ) { m_pStream = stream; } private: MemoryStream* m_pStream; }; //--------------------------------------------------------------------------- //! @brief バイナリデータを反転して読むリーダークラスです。 //--------------------------------------------------------------------------- class BinaryReverseReader { public: #if defined( NW_ENABLE_FLOAT64 ) NW_UT_DEFINE_READ_REVERSE_FUNC(f64,F64) #endif NW_UT_DEFINE_READ_REVERSE_FUNC(s64,S64) NW_UT_DEFINE_READ_REVERSE_FUNC(u64,U64) NW_UT_DEFINE_READ_REVERSE_FUNC(f32,F32) NW_UT_DEFINE_READ_REVERSE_FUNC(s32,S32) NW_UT_DEFINE_READ_REVERSE_FUNC(u32,U32) NW_UT_DEFINE_READ_REVERSE_FUNC(s16,S16) NW_UT_DEFINE_READ_REVERSE_FUNC(u16,U16) NW_UT_DEFINE_READ_NORMAL_FUNC(s8,S8) NW_UT_DEFINE_READ_NORMAL_FUNC(u8,U8) BinaryReverseReader( MemoryStream* stream = NULL ) : m_pStream( stream ) {} void SetStream( MemoryStream* stream ) { m_pStream = stream; } private: MemoryStream* m_pStream; }; } // namespace nw::ut } // namespace nw #endif // NW_UT_BINARYREADER_H_