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