1 | /*
|
---|
2 | * Project: MoleCuilder
|
---|
3 | * Description: creates and alters molecular systems
|
---|
4 | * Copyright (C) 2010 University of Bonn. All rights reserved.
|
---|
5 | * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
|
---|
6 | */
|
---|
7 |
|
---|
8 | /**
|
---|
9 | * \file parsers.dox
|
---|
10 | *
|
---|
11 | * Created on: Oct 28, 2011
|
---|
12 | * Author: heber
|
---|
13 | */
|
---|
14 |
|
---|
15 | /** \page parsers Format Parsers
|
---|
16 | *
|
---|
17 | * Format Parsers load or save information about the World (i.e. all atoms,
|
---|
18 | * contained bonds, ...) in a specific file format.
|
---|
19 | *
|
---|
20 | * All parsers derive from FormatParser and all available instances of
|
---|
21 | * FormatParser's are stored in a FormatParserStorage such that they can be
|
---|
22 | * retrieved with simply knowing the associated token.
|
---|
23 | *
|
---|
24 | * We have this storage as the FormatParser may also contain extra information
|
---|
25 | * per atom (...AtomDataContainer or alikes) which should be copied when an
|
---|
26 | * atom is copied. Hence, as soon as a FormatParser is accessed once it sits
|
---|
27 | * in the Storage and accumulates all information. Therefore, every parser
|
---|
28 | * instance is unique per type throughout the run of the program.
|
---|
29 | *
|
---|
30 | * A specific parser can be obtained from the FormatParserStorage just by
|
---|
31 | * knowing the correct keyword such as this:
|
---|
32 | * \code
|
---|
33 | * ParserTypes type = FormatParserStorage::getInstance().getTypeFromName("xyz");
|
---|
34 | * FormatParserInterface &parser = FormatParserStorage::getInstance().get(type);
|
---|
35 | * \endcode
|
---|
36 | *
|
---|
37 | * Associated to the FormatParser's is also the ChangeTracker (\ref observers)
|
---|
38 | * that observers the World and tells all parsers on program exit whether
|
---|
39 | * to save or not (i.e. whether any changes occurred). FormatParser_common
|
---|
40 | * makes sure that each FormatParser signUp()s to this ChangeTracker.
|
---|
41 | *
|
---|
42 | * Important is also the concept of a Parameter here. A Parameter is a value
|
---|
43 | * of a certain type with a given valid range or set of valid values. There
|
---|
44 | * ContinuousValue and DiscreteValue template classes that are subsequently
|
---|
45 | * joined with a name to give a ContinuousParameter and DiscreteParameter to
|
---|
46 | * be stored via a unifying ParameterInterface into a ParameterStorage. Such
|
---|
47 | * an instance each of the FormatParser's contains. Therein extra information
|
---|
48 | * such as a basis set, unit length, energy cutoff or other parser-specific
|
---|
49 | * parameters are stored.
|
---|
50 | *
|
---|
51 | * Various actions (WorldInputAction, WorldOuputAction, AtomSaveSelectedAtomsAction,
|
---|
52 | * MoleculeSaveSelectedAction) use the parser to load or store atoms or to
|
---|
53 | * control the behavior of storage (ParserSetOutputFormatAction, ...)
|
---|
54 | *
|
---|
55 | * \section parsers-add To add a new parser ...
|
---|
56 | *
|
---|
57 | * The following tasks are necessary:
|
---|
58 | * -# think of unique brief name for your parser, e.g. "xyz" and add to
|
---|
59 | * \b ParserTypes.def. This will inform FormatParserStorage of your new parser.
|
---|
60 | * (Again there is some preprocessor magic for instanting all ...)
|
---|
61 | * -# Implement a FormatParserTraits specialization with some common stuff to
|
---|
62 | * your parsers
|
---|
63 | * \code
|
---|
64 | * template<>
|
---|
65 | * struct FormatParserTrait<name>
|
---|
66 | * {
|
---|
67 | * //!> Name of the parser
|
---|
68 | * static const std::string name;
|
---|
69 | * //!> suffix of the files the parser understands to read and write
|
---|
70 | * static const std::string suffix;
|
---|
71 | * //!> ParserTypes enumeration for the parser
|
---|
72 | * static const enum ParserTypes type;
|
---|
73 | * };
|
---|
74 | * \endcode
|
---|
75 | * where \a name is the name unique name of your parser, e.g. \a xyz.
|
---|
76 | * -# Create all these static variables with matching contents.
|
---|
77 | * -# Implement a FormatParser specialization
|
---|
78 | * \code
|
---|
79 | * template <>
|
---|
80 | * class FormatParser< name > : virtual public FormatParserInterface, public FormatParser_common
|
---|
81 | * {
|
---|
82 | * ...
|
---|
83 | * };
|
---|
84 | * \endcode
|
---|
85 | * where \a name is again the name of your parser. FormatParser_common
|
---|
86 | * contains some functionality common to all Parsers where FormatParserInterface
|
---|
87 | * is the interface where load() and save() are defined. This allows for storage
|
---|
88 | * in FormatParserRegistry.
|
---|
89 | * -# implement FormatParserInterface::load() and FormatParserInterface::save().
|
---|
90 | * -# implement FormatParser_common::AtomInserted() and
|
---|
91 | * FormatParser_common::AtomRemoved()
|
---|
92 | *
|
---|
93 | *
|
---|
94 | * \date 2011-10-31
|
---|
95 | */
|
---|