1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: ut_BinaryReader.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision:$ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_UT_BINARYREADER_H_ 17 #define NW_UT_BINARYREADER_H_ 18 19 #include <nw/types.h> 20 #include <nw/ut/ut_ResTypes.h> 21 22 namespace nw { 23 namespace ut { 24 25 //--------------------------------------------------------------------------- 26 //! @brief メモリ上のバイト列を扱うStreamクラスです。 27 //--------------------------------------------------------------------------- 28 class MemoryStream 29 { 30 public: 31 MemoryStream( void* start = NULL, void* end = NULL ) m_StartAddress(start)32 : m_StartAddress( start ), 33 m_EndAddress( end ), 34 m_CurrentAddress( start ) 35 { 36 } 37 38 //! 現在のアドレスをセットします SetCurrentAddress(void * address)39 void SetCurrentAddress( void* address ) { m_CurrentAddress = address; } 40 41 //! 現在のアドレスを返します GetCurrentAddress()42 void* GetCurrentAddress() const { return m_CurrentAddress; } 43 44 // [TODO] ASSERT で止める? 45 //! @brief アドレスを移動します 46 //! 47 //! 移動が成功したら ture, 失敗したら false を返します MoveAddress(int size)48 bool MoveAddress( int size ) 49 { 50 void* tmp = (void*)( (int)m_CurrentAddress + size ); 51 if ( tmp < m_StartAddress ) { return false; } 52 else if ( tmp > m_EndAddress ) { return false; } 53 else 54 { 55 m_CurrentAddress = tmp; 56 return true; 57 } 58 } 59 60 private: 61 void* m_StartAddress; 62 void* m_EndAddress; 63 void* m_CurrentAddress; 64 }; 65 66 67 #define NW_UT_DEFINE_READ_NORMAL_FUNC(TYPE,NAME) \ 68 TYPE Read##NAME( const TYPE value ) const \ 69 { \ 70 return value; \ 71 } \ 72 TYPE Read##NAME() \ 73 { \ 74 TYPE* x = static_cast<TYPE*>( m_pStream->GetCurrentAddress() ); \ 75 m_pStream->MoveAddress( sizeof(TYPE) ); \ 76 return *x; \ 77 } 78 79 #define NW_UT_DEFINE_READ_REVERSE_FUNC(TYPE,NAME) \ 80 TYPE Read##NAME( const TYPE value ) const \ 81 { \ 82 return Endian::BSwap(value); \ 83 } \ 84 TYPE Read##NAME() \ 85 { \ 86 TYPE* x = static_cast<TYPE*>( m_pStream->GetCurrentAddress() ); \ 87 m_pStream->MoveAddress( sizeof(TYPE) ); \ 88 return Endian::BSwap(*x); \ 89 } 90 91 //--------------------------------------------------------------------------- 92 //! @brief バイナリデータをそのまま読むリーダークラスです。 93 //--------------------------------------------------------------------------- 94 class BinaryNormalReader 95 { 96 public: 97 #if defined( NW_ENABLE_FLOAT64 ) NW_UT_DEFINE_READ_NORMAL_FUNC(f64,F64)98 NW_UT_DEFINE_READ_NORMAL_FUNC(f64,F64) 99 #endif 100 NW_UT_DEFINE_READ_NORMAL_FUNC(s64,S64) 101 NW_UT_DEFINE_READ_NORMAL_FUNC(u64,U64) 102 NW_UT_DEFINE_READ_NORMAL_FUNC(f32,F32) 103 NW_UT_DEFINE_READ_NORMAL_FUNC(s32,S32) 104 NW_UT_DEFINE_READ_NORMAL_FUNC(u32,U32) 105 NW_UT_DEFINE_READ_NORMAL_FUNC(s16,S16) 106 NW_UT_DEFINE_READ_NORMAL_FUNC(u16,U16) 107 NW_UT_DEFINE_READ_NORMAL_FUNC(s8,S8) 108 NW_UT_DEFINE_READ_NORMAL_FUNC(u8,U8) 109 110 BinaryNormalReader( MemoryStream* stream = NULL ) 111 : m_pStream( stream ) {} 112 SetStream(MemoryStream * stream)113 void SetStream( MemoryStream* stream ) { m_pStream = stream; } 114 115 private: 116 MemoryStream* m_pStream; 117 }; 118 119 //--------------------------------------------------------------------------- 120 //! @brief バイナリデータを反転して読むリーダークラスです。 121 //--------------------------------------------------------------------------- 122 class BinaryReverseReader 123 { 124 public: 125 126 #if defined( NW_ENABLE_FLOAT64 ) NW_UT_DEFINE_READ_REVERSE_FUNC(f64,F64)127 NW_UT_DEFINE_READ_REVERSE_FUNC(f64,F64) 128 #endif 129 NW_UT_DEFINE_READ_REVERSE_FUNC(s64,S64) 130 NW_UT_DEFINE_READ_REVERSE_FUNC(u64,U64) 131 NW_UT_DEFINE_READ_REVERSE_FUNC(f32,F32) 132 NW_UT_DEFINE_READ_REVERSE_FUNC(s32,S32) 133 NW_UT_DEFINE_READ_REVERSE_FUNC(u32,U32) 134 NW_UT_DEFINE_READ_REVERSE_FUNC(s16,S16) 135 NW_UT_DEFINE_READ_REVERSE_FUNC(u16,U16) 136 NW_UT_DEFINE_READ_NORMAL_FUNC(s8,S8) 137 NW_UT_DEFINE_READ_NORMAL_FUNC(u8,U8) 138 139 BinaryReverseReader( MemoryStream* stream = NULL ) 140 : m_pStream( stream ) {} 141 SetStream(MemoryStream * stream)142 void SetStream( MemoryStream* stream ) { m_pStream = stream; } 143 144 private: 145 MemoryStream* m_pStream; 146 }; 147 148 } // namespace nw::ut 149 } // namespace nw 150 151 152 #endif // NW_UT_BINARYREADER_H_ 153 154