#ifndef READER_H_ #define READER_H_ #include "db.h" // reader for PGF files class PGF_INTERNAL_DECL PgfReader { public: PgfReader(FILE *in); uint8_t read_uint8(); uint16_t read_u16be(); uint64_t read_u64be(); double read_double(); uint64_t read_uint(); int64_t read_int() { return (int64_t) read_uint(); }; size_t read_len() { return (size_t) read_uint(); }; uint8_t read_tag() { return read_uint8(); } template ref read_name(PgfText V::* field) { return read_name_internal((size_t) &(((V*) NULL)->*field)); }; ref read_name() { return read_name_internal(0); }; template ref read_text(PgfText V::* field) { return read_text_internal((size_t) &(((V*) NULL)->*field)); }; ref read_text() { return read_text_internal(0); }; template Namespace read_namespace(ref (PgfReader::*read_value)(), size_t len); template Namespace read_namespace(ref (PgfReader::*read_value)()); template ref read_vector(PgfVector C::* field, void (PgfReader::*read_value)(ref val)); template ref> read_vector(void (PgfReader::*read_value)(ref val)); PgfLiteral read_literal(); PgfExpr read_expr(); void read_expr(ref r) { *r = read_expr(); }; void read_hypo(ref hypo); ref read_type(); ref read_flag(); PgfPatt read_patt(); void read_defn(ref> defn); ref read_absfun(); ref read_abscat(); void read_abstract(ref abstract); ref read_lincat(); ref read_lindex(); void read_linarg(ref linarg); void read_linres(ref linres); PgfSymbol read_symbol(); ref read_lin(); ref read_printname(); ref read_concrete(); ref read_pgf(); private: FILE *in; ref abstract; ref concrete; object read_name_internal(size_t struct_size); object read_text_internal(size_t struct_size); void read_patt2(ref r) { *r = read_patt(); }; void read_text2(ref> r) { *r = read_text(); }; void read_symbol2(ref r) { *r = read_symbol(); }; void read_seq2(ref> r) { *r = read_vector(&PgfReader::read_symbol2); } template ref read_symbol_idx(); }; #endif