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