and now in_range works too. YEAH.

This commit is contained in:
Meredith L. Patterson 2013-08-09 22:49:16 +02:00
parent 2408106191
commit 2e76cf2acf
2 changed files with 52 additions and 40 deletions

View file

@ -116,37 +116,44 @@ namespace hammer {
return RepeatN<T>(this, n); return RepeatN<T>(this, n);
} }
/* IntRange<IntResult> Int64::in_range(const int64_t lower, const int64_t upper) {
Int64 Int64::in_range(const int64_t lower, const int64_t upper) { Int64 p = Int64();
return IntRange(Int64(), lower, upper); return IntRange<IntResult>(p, lower, upper);
} }
Int32 Int32::in_range(const int32_t lower, const int32_t upper) { IntRange<IntResult> Int32::in_range(const int32_t lower, const int32_t upper) {
return IntRange(Int32(), lower, upper); Int32 p = Int32();
return IntRange<IntResult>(p, lower, upper);
} }
Int16 Int16::in_range(const int16_t lower, const int16_t upper) { IntRange<IntResult> Int16::in_range(const int16_t lower, const int16_t upper) {
return IntRange(Int16(), lower, upper); Int16 p = Int16();
return IntRange<IntResult>(p, lower, upper);
} }
Int8 Int8::in_range(const int8_t lower, const int8_t upper) { IntRange<IntResult> Int8::in_range(const int8_t lower, const int8_t upper) {
return IntRange(Int8(), lower, upper); Int8 p = Int8();
return IntRange<IntResult>(p, lower, upper);
} }
Uint64 Uint64::in_range(const uint64_t lower, const uint64_t upper) { IntRange<UintResult> Uint64::in_range(const uint64_t lower, const uint64_t upper) {
return IntRange(Uint64(), lower, upper); Uint64 p = Uint64();
return IntRange<UintResult>(p, lower, upper);
} }
Uint32 Uint32::in_range(const uint32_t lower, const uint32_t upper) { IntRange<UintResult> Uint32::in_range(const uint32_t lower, const uint32_t upper) {
return IntRange(Uint32(), lower, upper); Uint32 p = Uint32();
return IntRange<UintResult>(p, lower, upper);
} }
Uint16 Uint16::in_range(const uint16_t lower, const uint16_t upper) { IntRange<UintResult> Uint16::in_range(const uint16_t lower, const uint16_t upper) {
return IntRange(Uint16(), lower, upper); Uint16 p = Uint16();
return IntRange<UintResult>(p, lower, upper);
} }
Uint8 Uint8::in_range(const uint8_t lower, const uint8_t upper) { IntRange<UintResult> Uint8::in_range(const uint8_t lower, const uint8_t upper) {
return IntRange(Uint8(), lower, upper); Uint8 p = Uint8();
return IntRange<UintResult>(p, lower, upper);
} }
*/
} }

View file

@ -72,6 +72,7 @@ namespace hammer {
template<class T> class Many1; template<class T> class Many1;
template<class T> class Optional; template<class T> class Optional;
template<class T> class RepeatN; template<class T> class RepeatN;
template<class T> class IntRange;
template<typename T> template<typename T>
class Parser { class Parser {
@ -83,9 +84,11 @@ namespace hammer {
RepeatN<T> many(size_t n); RepeatN<T> many(size_t n);
Optional<T> optional(); Optional<T> optional();
RepeatN<T> operator[](size_t n); RepeatN<T> operator[](size_t n);
HParser* parser() { return _parser; } const HParser* parser() { return _parser; }
HParser* _parser; protected:
const HParser* _parser;
Parser() { } Parser() { }
// Parser(const Parser &p) : _parser(p.parser()) { } // hopefully we don't need a copy constructor...
}; };
class Token : public Parser<BytesResult> { class Token : public Parser<BytesResult> {
@ -118,16 +121,6 @@ namespace hammer {
uint8_t _lower, _upper; uint8_t _lower, _upper;
}; };
class IntRange : public Parser<IntResult> {
public:
IntRange(Parser &p, const int64_t lower, const int64_t upper) : _p(p), _lower(lower), _upper(upper) {
_parser = h_int_range(p.parser(), lower, upper);
}
private:
Parser _p;
int64_t _lower, _upper;
};
class SignedBits : public Parser<IntResult> { class SignedBits : public Parser<IntResult> {
public: public:
SignedBits(size_t len) : _len(len) { SignedBits(size_t len) : _len(len) {
@ -151,7 +144,7 @@ namespace hammer {
Int64() { Int64() {
_parser = h_int64(); _parser = h_int64();
} }
Int64 in_range(const int64_t lower, const int64_t upper); IntRange<IntResult> in_range(const int64_t lower, const int64_t upper);
}; };
class Int32 : public Parser<IntResult> { class Int32 : public Parser<IntResult> {
@ -159,7 +152,7 @@ namespace hammer {
Int32() { Int32() {
_parser = h_int32(); _parser = h_int32();
} }
Int32 in_range(const int32_t lower, const int32_t upper); IntRange<IntResult> in_range(const int32_t lower, const int32_t upper);
}; };
class Int16 : public Parser<IntResult> { class Int16 : public Parser<IntResult> {
@ -167,7 +160,7 @@ namespace hammer {
Int16() { Int16() {
_parser = h_int16(); _parser = h_int16();
} }
Int16 in_range(const int16_t lower, const int16_t upper); IntRange<IntResult> in_range(const int16_t lower, const int16_t upper);
}; };
class Int8 : public Parser<IntResult> { class Int8 : public Parser<IntResult> {
@ -175,7 +168,7 @@ namespace hammer {
Int8() { Int8() {
_parser = h_int8(); _parser = h_int8();
} }
Int8 in_range(const int8_t lower, const int8_t upper); IntRange<IntResult> in_range(const int8_t lower, const int8_t upper);
}; };
class Uint64 : public Parser<UintResult> { class Uint64 : public Parser<UintResult> {
@ -183,7 +176,7 @@ namespace hammer {
Uint64() { Uint64() {
_parser = h_uint64(); _parser = h_uint64();
} }
Uint64 in_range(const uint64_t lower, const uint64_t upper); IntRange<UintResult> in_range(const uint64_t lower, const uint64_t upper);
}; };
class Uint32 : public Parser<UintResult> { class Uint32 : public Parser<UintResult> {
@ -191,7 +184,7 @@ namespace hammer {
Uint32() { Uint32() {
_parser = h_uint32(); _parser = h_uint32();
} }
Uint32 in_range(const uint32_t lower, const uint32_t upper); IntRange<UintResult> in_range(const uint32_t lower, const uint32_t upper);
}; };
class Uint16 : public Parser<UintResult> { class Uint16 : public Parser<UintResult> {
@ -199,7 +192,7 @@ namespace hammer {
Uint16() { Uint16() {
_parser = h_uint16(); _parser = h_uint16();
} }
Uint16 in_range(const uint16_t lower, const uint16_t upper); IntRange<UintResult> in_range(const uint16_t lower, const uint16_t upper);
}; };
class Uint8 : public Parser<UintResult> { class Uint8 : public Parser<UintResult> {
@ -207,7 +200,18 @@ namespace hammer {
Uint8() { Uint8() {
_parser = h_uint8(); _parser = h_uint8();
} }
Uint8 in_range(const uint8_t lower, const uint8_t upper); IntRange<UintResult> in_range(const uint8_t lower, const uint8_t upper);
};
template<class T>
class IntRange : public Parser<T> {
public:
IntRange(Parser<T> &p, const int64_t lower, const int64_t upper) : _p(p), _lower(lower), _upper(upper) {
this->_parser = h_int_range(p.parser(), lower, upper);
}
private:
Parser<T> _p;
int64_t _lower, _upper;
}; };
template<class T> template<class T>
@ -299,12 +303,13 @@ namespace hammer {
}; };
class Sequence : public Parser<SequenceResult> { class Sequence : public Parser<SequenceResult> {
friend class Parser;
public: public:
Sequence(list<Parser> &ps) : _ps(ps) { Sequence(list<Parser> &ps) : _ps(ps) {
void *parsers[ps.size()]; void *parsers[ps.size()];
size_t i = 0; size_t i = 0;
for (list<Parser>::iterator it=ps.begin(); it != ps.end(); ++it, ++i) { for (list<Parser>::iterator it=ps.begin(); it != ps.end(); ++it, ++i) {
parsers[i] = it->parser(); parsers[i] = const_cast<HParser*>(it->parser());
} }
_parser = h_sequence__a(parsers); _parser = h_sequence__a(parsers);
} }
@ -319,7 +324,7 @@ namespace hammer {
void *parsers[ps.size()]; void *parsers[ps.size()];
size_t i = 0; size_t i = 0;
for (list<Parser<SequenceResult> >::iterator it=ps.begin(); it != ps.end(); ++it, ++i) { for (list<Parser<SequenceResult> >::iterator it=ps.begin(); it != ps.end(); ++it, ++i) {
parsers[i] = it->parser(); parsers[i] = const_cast<HParser*>(it->parser());
} }
_parser = h_choice__a(parsers); _parser = h_choice__a(parsers);
} }