22#define BINARY_H
33
44#include " dolphin/types.h"
5+ #include " JSystem/JGadget/search.h"
56
67namespace JGadget {
78namespace binary {
@@ -26,11 +27,11 @@ struct TParseData {
2627 /* 0x0 */ const void * raw;
2728};
2829
29- template <int T >
30+ template <int S >
3031struct TParseData_aligned : public TParseData {
3132 TParseData_aligned (const void * pContent) : TParseData(pContent) {}
3233 void setRaw (const void * p) {
33- /* if ((u32)p % T != 0) {
34+ /* if ((u32)p % S != 0) {
3435 JUTWarn w;
3536 w << "misaligned : " << (u32)p;
3637 } */
@@ -63,41 +64,56 @@ struct TParse_header_block {
6364template <typename T>
6465struct TParseValue_raw_ {
6566 typedef T ParseType;
66- static T parse (const void * data) { return *(T*)data; }
67+ static T parse (const void * data) { return (T)*(T*)data; }
68+ };
69+
70+ template <typename T>
71+ struct TParseValue_raw : public TParseValue_raw_ <T> {
72+ typedef TParseValue_raw_<T> InnerParseValueClass;
6773};
6874
6975template <typename T>
7076struct TParseValue_endian_big_ : public TParseValue_raw_ <T> {
71- static T parse (const void * data) { return TParseValue_raw_::parse (data); }
77+ static T parse (const void * data) { return TParseValue_raw_<T> ::parse (data); }
7278};
7379
74- template <typename T, template < class > class Parser >
75- struct TParseValue : public Parser <T> {
76- static T parse (const void * data) { return Parser<T> ::parse (data); }
80+ template <class Parser >
81+ struct TParseValue : public Parser {
82+ static typename Parser::ParseType parse (const void * data) { return Parser::parse (data); }
7783
78- static T parse (const void * data, s32 advanceNum) {
79- return Parser<T> ::parse (advance (data, advanceNum));
84+ static typename Parser::ParseType parse (const void * data, s32 advanceNum) {
85+ return Parser::parse (advance (data, advanceNum));
8086 }
8187
8288 static const void * advance (const void * data, s32 advanceNum) {
83- return (char *)data + (advanceNum * sizeof (T ));
89+ return (char *)data + (advanceNum * sizeof (Parser::ParseType ));
8490 }
8591};
8692
8793template <class Parser , int size>
88- struct TValueIterator {
94+ struct TValueIterator
95+ : public JGadget::TIterator<
96+ std::random_access_iterator_tag,
97+ typename Parser::ParseType,
98+ ptrdiff_t ,
99+ typename Parser::ParseType*,
100+ typename Parser::ParseType&
101+ >
102+ {
103+ typedef typename Parser::ParseType ValueType;
104+
89105 TValueIterator (const void * begin) {
90- mBegin = begin;
106+ mBegin = reinterpret_cast < const char *>( begin) ;
91107 }
92108
93109 const void * get () const { return mBegin ; }
94110
95111 typename Parser::ParseType operator *() const {
96- return Parser::parse (get ());
112+ return TParseValue< typename Parser::InnerParseValueClass> ::parse (get ());
97113 }
98114
99115 TValueIterator& operator ++() {
100- const_cast < u32 *>( mBegin )++ ;
116+ mBegin += size ;
101117 return *this ;
102118 }
103119
@@ -107,31 +123,67 @@ struct TValueIterator {
107123 return old;
108124 }
109125
110- TValueIterator& operator +=(s32 v) {
111- const_cast <u32 *>(mBegin ) += v;
126+ TValueIterator& operator +=(s32 n) {
127+ mBegin += size * n;
128+ return *this ;
129+ }
130+
131+ TValueIterator& operator --() {
132+ mBegin -= size;
112133 return *this ;
113134 }
114135
115- const void * mBegin ;
136+ char const * mBegin ;
116137};
117138
118139template <typename T>
119- struct TValueIterator_raw : public TValueIterator <TParseValue_raw_<u8 >, 1 > {
120- TValueIterator_raw (const void * begin) : TValueIterator<TParseValue_raw_<u8 >, 1 >(begin) {}
140+ struct TValueIterator_raw : public TValueIterator <TParseValue_raw<T>, sizeof (T)> {
141+ TValueIterator_raw (const void * begin) : TValueIterator<TParseValue_raw<T>, sizeof (T)>(begin) {}
142+
143+ friend bool operator ==(TValueIterator<TParseValue_raw<T>, sizeof (T)> a, TValueIterator<TParseValue_raw<T>, sizeof (T)> b) {
144+ return a.mBegin == b.mBegin ;
145+ }
146+
147+ friend bool operator !=(TValueIterator<TParseValue_raw<T>, sizeof (T)> a, TValueIterator<TParseValue_raw<T>, sizeof (T)> b) {
148+ return !operator ==(a, b);
149+ }
150+
151+ friend TValueIterator<TParseValue_raw<T>, sizeof (T)> operator +(TValueIterator<TParseValue_raw<T>, sizeof (T)> a, s32 b) {
152+ TValueIterator<TParseValue_raw<T>, sizeof (T)> it = a;
153+ it += b;
154+ return it;
155+ }
156+ };
157+
158+ template <typename T>
159+ struct TParseValue_misaligned_ : public TParseValue_raw_ <T> {
160+ typedef T ParseType;
161+ static T parse (const void * data) { return TParseValue_raw_<T>::parse (data); }
121162};
122163
123164template <typename T>
124- struct TParseValue_misaligned : TParseValue_raw_<T> {
125- static T parse ( const void * data) { return TParseValue_raw_::parse (data); }
165+ struct TParseValue_misaligned : public TParseValue_raw_ <T> {
166+ typedef TParseValue_misaligned_<T> InnerParseValueClass;
126167};
127168
128169template <typename T>
129170struct TValueIterator_misaligned : public TValueIterator <TParseValue_misaligned<T>, sizeof (T)> {
130171 TValueIterator_misaligned (const void * begin) : TValueIterator<TParseValue_misaligned<T>, sizeof (T)>(begin) {}
131- };
132172
173+ friend bool operator ==(TValueIterator<TParseValue_misaligned<T>, sizeof (T)> a, TValueIterator<TParseValue_misaligned<T>, sizeof (T)> b) {
174+ return a.mBegin == b.mBegin ;
175+ }
176+
177+ friend bool operator !=(TValueIterator<TParseValue_misaligned<T>, sizeof (T)> a, TValueIterator<TParseValue_misaligned<T>, sizeof (T)> b) {
178+ return !operator ==(a, b);
179+ }
133180
134- inline bool operator ==(TValueIterator<TParseValue_misaligned<u32 >, 4 > a, TValueIterator<TParseValue_misaligned<u32 >, 4 > b) { return a.mBegin == b.mBegin ; }
181+ friend TValueIterator<TParseValue_misaligned<T>, sizeof (T)> operator +(TValueIterator<TParseValue_misaligned<T>, sizeof (T)> a, s32 b) {
182+ TValueIterator<TParseValue_misaligned<T>, sizeof (T)> it (a);
183+ it += b;
184+ return it;
185+ }
186+ };
135187
136188} // namespace binary
137189} // namespace JGadget
0 commit comments