| [ce133f] | 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 | /**
 | 
|---|
| [19bc74] | 9 |  * \file parsers.dox
 | 
|---|
| [ce133f] | 10 |  *
 | 
|---|
| [19bc74] | 11 |  * Created on: Oct 28, 2011
 | 
|---|
| [ce133f] | 12 |  *    Author: heber
 | 
|---|
 | 13 |  */
 | 
|---|
| [750cff] | 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 |  */
 | 
|---|