1 | /*
|
---|
2 | * FormatParser.hpp
|
---|
3 | *
|
---|
4 | * Created on: Mar 1, 2010
|
---|
5 | * Author: metzler
|
---|
6 | */
|
---|
7 |
|
---|
8 | #ifndef FORMATPARSER_HPP_
|
---|
9 | #define FORMATPARSER_HPP_
|
---|
10 |
|
---|
11 | // include config.h
|
---|
12 | #ifdef HAVE_CONFIG_H
|
---|
13 | #include <config.h>
|
---|
14 | #endif
|
---|
15 |
|
---|
16 | #include <iosfwd>
|
---|
17 | #include <string>
|
---|
18 | #include <vector>
|
---|
19 |
|
---|
20 | #include "CodePatterns/Assert.hpp"
|
---|
21 |
|
---|
22 | #include "FormatParserTrait.hpp"
|
---|
23 | #include "FormatParserInterface.hpp"
|
---|
24 | #include "FormatParser_common.hpp"
|
---|
25 | #include "ParserTypes.hpp"
|
---|
26 |
|
---|
27 | class atom;
|
---|
28 |
|
---|
29 | /**
|
---|
30 | * @file
|
---|
31 | * <H1> FormatParser Howto </H1>
|
---|
32 | *
|
---|
33 | * <H2> Introduction </H2>
|
---|
34 | *
|
---|
35 | * FormatParsers parse external streams (files) and bring their information
|
---|
36 | * into the World. That is they implement load and save functions that work
|
---|
37 | * on a specific vector atoms.
|
---|
38 | *
|
---|
39 | * <H2> Building your own Parsers </H2>
|
---|
40 | *
|
---|
41 | * Building Parsers is easy. All you have to do is the following:
|
---|
42 | * -# add a new parser type to the file ParserTypes.def.
|
---|
43 | * -# add a new template specialization of FormatParser in a new header and
|
---|
44 | * module that implement the virtual load and save functions.
|
---|
45 | * -# Add the header file of your new parser to FormatParserStorage.cpp.
|
---|
46 | *
|
---|
47 | * <H3> Specific notes on the macros </H3>
|
---|
48 | *
|
---|
49 | * To clarify a bit the internals of all the different FormatParser... files, here
|
---|
50 | * are some notes:
|
---|
51 | * -# We make use of boost::preprocessor to generate lists from the sequence
|
---|
52 | * given in ParserTypes.def (and undefined in ParserTypes.undef). These might
|
---|
53 | * be forward declarations of even implementations. This is to assure that
|
---|
54 | * none are forgotten when a new FormatParser is added.
|
---|
55 | * -# Thanks to the above construct FormatParserStorage also immediately knows
|
---|
56 | * about any new parsers and can get and add such instances.
|
---|
57 | */
|
---|
58 |
|
---|
59 | /**
|
---|
60 | * General parser which observes the change tracker.
|
---|
61 | */
|
---|
62 | template <enum ParserTypes Ptype>
|
---|
63 | class FormatParser : virtual public FormatParserInterface, public FormatParser_common {
|
---|
64 | FormatParser() :
|
---|
65 | FormatParser_common(NULL)
|
---|
66 | {
|
---|
67 | ASSERT(0, "FormatParser<>::FormatParser() - unspecialized function cannot be called.");
|
---|
68 | }
|
---|
69 | virtual ~FormatParser()
|
---|
70 | {
|
---|
71 | ASSERT(0, "FormatParser<>::~FormatParser() - unspecialized function cannot be called.");
|
---|
72 | }
|
---|
73 |
|
---|
74 | void load(std::istream *file)
|
---|
75 | {
|
---|
76 | ASSERT(0, "FormatParser<>::load() - unspecialized function cannot be called.");
|
---|
77 | }
|
---|
78 | void save(std::ostream *file, const std::vector<const atom *> &atoms)
|
---|
79 | {
|
---|
80 | ASSERT(0, "FormatParser<>::save() - unspecialized function cannot be called.");
|
---|
81 | }
|
---|
82 | };
|
---|
83 |
|
---|
84 | #include "FormatParser_specializations_header.hpp"
|
---|
85 |
|
---|
86 | #endif /* FORMATPARSER_HPP_ */
|
---|