Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
binary.h
Go to the documentation of this file.
1#ifndef JGADGET_BINARY_H
2#define JGADGET_BINARY_H
3
6
7namespace JGadget {
8namespace binary {
9
10struct TEBit {
12};
13
14const void* parseVariableUInt_16_32_following(const void* pu16, u32* pu32First, u32* pu32Second, TEBit* tebit);
15
16inline bool isPower2(unsigned int arg0) {
17 return arg0 != 0 && (arg0 & arg0 - 1) == 0;
18}
19
20inline u32 align_roundUp(unsigned int arg0, unsigned int uAlign) {
21 JUT_ASSERT(98, isPower2(uAlign));
22 return (arg0 + uAlign - 1) & ~(uAlign - 1);
23}
24
25struct TParseData {
26 TParseData(const void* pContent) : raw(pContent) {}
27
28 const void* getRaw() const { return raw; }
29 void setRaw(const void* p) { raw = p; }
30
31 /* 0x0 */ const void* raw;
32};
33
34template <int S>
36 TParseData_aligned(const void* pContent) : TParseData(pContent) {}
37 void setRaw(const void* p) {
38 /* if ((u32)p % S != 0) {
39 JUTWarn w;
40 w << "misaligned : " << (u32)p;
41 } */
42 static_cast<TParseData*>(this)->setRaw(p);
43 }
44};
45
46// Base for header and/or block parsing
48 virtual ~TParse_header_block() = 0;
49
50 virtual bool parseHeader_next(const void** ppData_inout, u32* puBlock_out, u32 arg2) = 0;
51 virtual bool parseBlock_next(const void** ppData_inout, u32* puData_out, u32 arg2) = 0;
52
53 bool parse_next(const void** ppData_inout, u32 a2);
54
55 bool parse(const void* ppData_inout, u32 a2) {
56 return parse_next(&ppData_inout, a2);
57 }
58};
59
60template <typename T>
62 typedef T ParseType;
63 static T parse(const void* data) { return (T)*(T*)data; }
64};
65
66template <typename T>
70
71template <typename T>
73 static T parse(const void* data) { return TParseValue_raw_<T>::parse(data); }
74};
75
76template <class Parser>
77struct TParseValue : public Parser {
78 static typename Parser::ParseType parse(const void* data) { return Parser::parse(data); }
79
80 static typename Parser::ParseType parse(const void* data, s32 advanceNum) {
81 return Parser::parse(advance(data, advanceNum));
82 }
83
84 static const void* advance(const void* data, s32 advanceNum) {
85 return (char*)data + (advanceNum * sizeof(typename Parser::ParseType));
86 }
87};
88
89template<class Parser, int size>
91 : public JGadget::TIterator<
92 std::random_access_iterator_tag,
93 typename Parser::ParseType,
94 ptrdiff_t,
95 typename Parser::ParseType*,
96 typename Parser::ParseType&
97 >
98 {
99 typedef typename Parser::ParseType ValueType;
100
101 TValueIterator(const void* begin) {
102 mBegin = reinterpret_cast<const char*>(begin);
103 bool unused = false;
104 (void)&unused;
105 }
106
107 const void* get() const { return mBegin; }
108
109 typename Parser::ParseType operator*() const {
111 }
112
114 mBegin += size;
115 return *this;
116 }
117
119 TValueIterator old(*this);
120 ++(*this);
121 return old;
122 }
123
125 mBegin += size * n;
126 return *this;
127 }
128
130 mBegin -= size;
131 return *this;
132 }
133
134 char const* mBegin;
135};
136
137template<typename T>
138struct TValueIterator_raw : public TValueIterator<TParseValue_raw<T>, sizeof(T)> {
139 TValueIterator_raw(const void* begin) : TValueIterator<TParseValue_raw<T>, sizeof(T)>(begin) {}
140
142 return a.mBegin == b.mBegin;
143 }
144
146 return !operator==(a, b);
147 }
148
149 friend TValueIterator<TParseValue_raw<T>, sizeof(T)> operator+(TValueIterator<TParseValue_raw<T>, sizeof(T)> a, s32 b) {
151 it += b;
152 return it;
153 }
154};
155
156template <typename T>
158 typedef T ParseType;
159 static T parse(const void* data) { return TParseValue_raw_<T>::parse(data); }
160};
161
162template <typename T>
166
167template<typename T>
168struct TValueIterator_misaligned : public TValueIterator<TParseValue_misaligned<T>, sizeof(T)> {
169 TValueIterator_misaligned(const void* begin) : TValueIterator<TParseValue_misaligned<T>, sizeof(T)>(begin) {}
170
172 return a.mBegin == b.mBegin;
173 }
174
176 return !operator==(a, b);
177 }
178
181 it += b;
182 return it;
183 }
184};
185
186} // namespace binary
187} // namespace JGadget
188
189#endif /* JGADGET_BINARY_H */
static u8 const unused[12]
Definition d_a_cstatue.cpp:16
unsigned int size
Definition __os.h:106
p
Definition e_acos.c:103
n
Definition e_fmod.c:115
unsigned long u32
Definition types.h:12
signed long s32
Definition types.h:11
a
Definition k_cos.c:89
static const double T[]
Definition k_tan.c:106
bool isPower2(unsigned int arg0)
Definition binary.h:16
u32 align_roundUp(unsigned int arg0, unsigned int uAlign)
Definition binary.h:20
const void * parseVariableUInt_16_32_following(const void *pu16, u32 *pu32First, u32 *pu32Second, TEBit *tebit)
Definition binary.cpp:14
Definition linklist.cpp:6
Definition search.h:69
Definition binary.h:10
u32 value
Definition binary.h:11
TParseData_aligned(const void *pContent)
Definition binary.h:36
void setRaw(const void *p)
Definition binary.h:37
Definition binary.h:25
TParseData(const void *pContent)
Definition binary.h:26
void setRaw(const void *p)
Definition binary.h:29
const void * getRaw() const
Definition binary.h:28
const void * raw
Definition binary.h:31
static T parse(const void *data)
Definition binary.h:73
T ParseType
Definition binary.h:158
static T parse(const void *data)
Definition binary.h:159
TParseValue_misaligned_< T > InnerParseValueClass
Definition binary.h:164
Definition binary.h:61
static T parse(const void *data)
Definition binary.h:63
T ParseType
Definition binary.h:62
Definition binary.h:67
TParseValue_raw_< T > InnerParseValueClass
Definition binary.h:68
Definition binary.h:77
static const void * advance(const void *data, s32 advanceNum)
Definition binary.h:84
static Parser::ParseType parse(const void *data, s32 advanceNum)
Definition binary.h:80
static Parser::ParseType parse(const void *data)
Definition binary.h:78
virtual ~TParse_header_block()=0
Definition binary.cpp:51
virtual bool parseHeader_next(const void **ppData_inout, u32 *puBlock_out, u32 arg2)=0
bool parse(const void *ppData_inout, u32 a2)
Definition binary.h:55
bool parse_next(const void **ppData_inout, u32 a2)
Definition binary.cpp:53
virtual bool parseBlock_next(const void **ppData_inout, u32 *puData_out, u32 arg2)=0
TValueIterator_misaligned(const void *begin)
Definition binary.h:169
friend bool operator!=(TValueIterator< TParseValue_misaligned< T >, sizeof(T)> a, TValueIterator< TParseValue_misaligned< T >, sizeof(T)> b)
Definition binary.h:175
friend bool operator==(TValueIterator< TParseValue_misaligned< T >, sizeof(T)> a, TValueIterator< TParseValue_misaligned< T >, sizeof(T)> b)
Definition binary.h:171
friend bool operator==(TValueIterator< TParseValue_raw< T >, sizeof(T)> a, TValueIterator< TParseValue_raw< T >, sizeof(T)> b)
Definition binary.h:141
TValueIterator_raw(const void *begin)
Definition binary.h:139
friend bool operator!=(TValueIterator< TParseValue_raw< T >, sizeof(T)> a, TValueIterator< TParseValue_raw< T >, sizeof(T)> b)
Definition binary.h:145
Definition binary.h:98
TValueIterator(const void *begin)
Definition binary.h:101
const void * get() const
Definition binary.h:107
Parser::ParseType ValueType
Definition binary.h:99
const TValueIterator operator++(int)
Definition binary.h:118
TValueIterator & operator+=(s32 n)
Definition binary.h:124
char const * mBegin
Definition binary.h:134
TValueIterator & operator++()
Definition binary.h:113
Parser::ParseType operator*() const
Definition binary.h:109
TValueIterator & operator--()
Definition binary.h:129