source: src/Actions/ValueStorage.hpp@ 78bb14

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 78bb14 was 78bb14, checked in by Frederik Heber <heber@…>, 14 years ago

BUGFIX: SetOutputFormatsAction seemed to add last format twice. Thanks Daniel!

  • this was a bug in ValueStorage: while-loop checked for stream.fail(), but the stream might also fail within and nonetheless we pushed the (then unaltered from last iteration) temp value. Hence, doubly occuring last item.
  • to prevent this, we test within for stream.fail() and for all others we placed ASSERT's everywhere (as internally strings are used for conversion and for a vector, we have to parse (at least) three strings).
  • if std::vector<>'s are parsed, we ASSERT only that at least one value was parsed.
  • FormatParserStorage now just gives a warning, when an already presen Parser is added again, but gives a not that input type is not needed to be specified as output type as well.

thanks Daniel for pointing this out!

  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 * ValueStorage.hpp
3 *
4 * Created on: Jul 22, 2010
5 * Author: heber
6 */
7
8#ifndef VALUESTORAGE_HPP_
9#define VALUESTORAGE_HPP_
10
11#include <boost/filesystem.hpp>
12#include <boost/lexical_cast.hpp>
13#include <boost/program_options.hpp>
14
15#include <map>
16#include <set>
17#include <vector>
18#include <typeinfo>
19
20#include "Actions/OptionTrait.hpp"
21#include "Actions/OptionRegistry.hpp"
22#include "Exceptions/IllegalTypeException.hpp"
23#include "Exceptions/MissingValueException.hpp"
24#include "Helpers/Assert.hpp"
25#include "Patterns/Singleton.hpp"
26
27class MapOfActionsTest;
28
29class Box;
30class atom;
31class element;
32class molecule;
33class Vector;
34
35namespace po = boost::program_options;
36
37using boost::lexical_cast;
38
39#include "Patterns/Singleton.hpp"
40
41/** ValueStorage serves as a mediator to MapOfActions.
42 * This is needed to relax inter-dependencies between the Queries and the Actions.
43 * I.e. this is the interface implemented in MapOfActions which both can safely rely on
44 * to store&retrieve/exchange values.
45 */
46class ValueStorage : public Singleton<ValueStorage> {
47 friend class Singleton<ValueStorage>;
48
49public:
50
51 bool isCurrentValuePresent(const char *name) const;
52 void queryCurrentValue(const char * name, const atom * &_T);
53 void queryCurrentValue(const char * name, const element * &_T);
54 void queryCurrentValue(const char * name, const molecule * &_T);
55 void queryCurrentValue(const char * name, class Box &_T);
56 void queryCurrentValue(const char * name, class Vector &_T);
57 void queryCurrentValue(const char * name, class BoxVector &_T);
58 void queryCurrentValue(const char * name, std::vector<const atom *>&_T);
59 void queryCurrentValue(const char * name, std::vector<const element *>&_T);
60 void queryCurrentValue(const char * name, std::vector<const molecule *>&_T);
61 void queryCurrentValue(const char * name, boost::filesystem::path&_T);
62
63 /** Gets a value from the storage
64 * If the value is not present, an ASSERT is thrown unless optional is set to true.
65 * \param _T key of value
66 * \param optional whether this value is optional, i.e. may actually not be in the storage (i.e. may return false in this case).
67 * \return true - value present, false - value not present (only given when optional set to true)
68 */
69 template<typename T> void queryCurrentValue(const char * name, T &_T)
70 {
71 if (typeid( T ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
72 if (CurrentValueMap.find(name) == CurrentValueMap.end())
73 throw MissingValueException(__FILE__, __LINE__);
74 _T = lexical_cast<T>(CurrentValueMap[name].c_str());
75 CurrentValueMap.erase(name);
76 } else
77 throw IllegalTypeException(__FILE__,__LINE__);
78 }
79 template<typename T> void queryCurrentValue(const char * name, std::vector<T> &_T)
80 {
81 T temp;
82 if (typeid( std::vector<T> ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
83 if (CurrentValueMap.find(name) == CurrentValueMap.end())
84 throw MissingValueException(__FILE__, __LINE__);
85 std::istringstream stream(CurrentValueMap[name]);
86 CurrentValueMap.erase(name);
87 while (!stream.fail()) {
88 stream >> temp >> std::ws;
89 if (!stream.fail()) {
90 _T.push_back(temp);
91 }
92 }
93 } else
94 throw IllegalTypeException(__FILE__,__LINE__);
95 }
96
97 void setCurrentValue(const char * name, const atom * &_T);
98 void setCurrentValue(const char * name, const element * &_T);
99 void setCurrentValue(const char * name, const molecule * &_T);
100 void setCurrentValue(const char * name, class Box &_T);
101 void setCurrentValue(const char * name, class Vector &_T);
102 void setCurrentValue(const char * name, std::vector<const atom *>&_T);
103 void setCurrentValue(const char * name, std::vector<const element *>&_T);
104 void setCurrentValue(const char * name, std::vector<const molecule *>&_T);
105 void setCurrentValue(const char * name, boost::filesystem::path&_T);
106
107 /** Sets a value in the storage.
108 * \param name key of value
109 * \param _T value
110 */
111 template<class T> void setCurrentValue(const char * name, T &_T)
112 {
113 std::ostringstream stream;
114 if (typeid( T ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
115 stream << _T;
116 CurrentValueMap[name] = stream.str();
117 } else
118 throw IllegalTypeException(__FILE__,__LINE__);
119 }
120 /** Sets a value in the storage.
121 * \param name key of value
122 * \param _T value
123 */
124 template<class T> void setCurrentValue(const char * name, std::vector<T> &_T)
125 {
126 std::ostringstream stream;
127 if (typeid( std::vector<T> ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
128 std::ostringstream stream;
129 for (typename std::vector<T>::const_iterator iter = _T.begin(); iter != _T.end(); ++iter) {
130 stream << (*iter) << " ";
131 }
132 CurrentValueMap[name] = stream.str();
133 } else
134 throw IllegalTypeException(__FILE__,__LINE__);
135 }
136
137 const std::string getCurrentValue(std::string actionname);
138
139protected:
140 ValueStorage();
141 ~ValueStorage();
142
143 std::map<std::string, std::string> CurrentValueMap;
144
145 OptionRegistry &OptionRegistry_instance;
146};
147
148#endif /* VALUESTORAGE_HPP_ */
Note: See TracBrowser for help on using the repository browser.