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