| 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 | */ | 
|---|