source: src/Parser/FormatParser_Parameters.cpp@ ff4fff9

CombiningParticlePotentialParsing
Last change on this file since ff4fff9 was 6440c6, checked in by Frederik Heber <heber@…>, 12 years ago

Reworked inheritance graph of Parameter and Value.

  • Property mode set to 100644
File size: 7.0 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * FormatParser_Parameters.cpp
25 *
26 * Created on: Sep 30, 2011
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "CodePatterns/MemDebug.hpp"
36
37#include <iostream>
38#include <boost/algorithm/string.hpp>
39#include <boost/tokenizer.hpp>
40#include <sstream>
41#include <string>
42
43#include "CodePatterns/Assert.hpp"
44#include "CodePatterns/Log.hpp"
45
46#include "Parameters/ParameterInterface.hpp"
47#include "FormatParser_Parameters.hpp"
48
49/** Constructor of class FormatParser_Parameters.
50 *
51 * \note we make sure that storage is always present
52 *
53 */
54FormatParser_Parameters::FormatParser_Parameters() :
55 storage(new ParameterStorage)
56{}
57
58/** Copy constructor of class FormatParser_Parameters.
59 *
60 * @param _parameters instance to copy from
61 */
62FormatParser_Parameters::FormatParser_Parameters(const FormatParser_Parameters &_parameters) :
63 storage(new ParameterStorage(*_parameters.storage))
64{}
65
66
67/** Destructor of class FormatParser_Parameters.
68 *
69 */
70FormatParser_Parameters::~FormatParser_Parameters()
71{
72 delete storage;
73}
74
75/** Implements the Parameter::clone() function.
76 *
77 * @return another instance with an identical copy of each parameter in \a storage
78 */
79FormatParser_Parameters* FormatParser_Parameters::clone() const
80{
81 return (new FormatParser_Parameters(*this));
82}
83
84/** This makes this instance a clone of \a _instance.
85 *
86 * \note This is basically the other way round to clone().
87 *
88 * @param _instance instance to clone from
89 */
90void FormatParser_Parameters::makeClone(const FormatParser_Parameters &_instance)
91{
92 // we simply remove storage
93 delete storage;
94 // and clone the one from _instance
95 storage = new ParameterStorage(*_instance.storage);
96}
97
98/** Adds a parameter to \a storage.
99 *
100 * This just eases use, saves some typing and is more clear as to what is done.
101 *
102 * @param instance parameter to add
103 */
104void FormatParser_Parameters::appendParameter(ParameterInterface *instance)
105{
106 storage->registerInstance(instance);
107}
108
109/** Checks for presence of a parameter in \a storage.
110 *
111 * This just eases use, saves some typing and is more clear as to what is done.
112 *
113 * @return true - parameter by this \a _name is present in storage, false - else
114 */
115bool FormatParser_Parameters::haveParameter(const std::string &_name) const
116{
117 return storage->isPresentByName(_name);
118}
119
120/** Gets a parameter from \a storage.
121 *
122 * This just eases use, saves some typing and is more clear as to what is done.
123 *
124 * @return pointer to instance with this \a _name
125 */
126ParameterInterface *FormatParser_Parameters::getParameter(const std::string &_name) const
127{
128 return storage->getByName(_name);
129}
130
131/** Output operator for the contents of FormatParser_Parameters::params.
132 *
133 * @param ost output stream
134 * @param params reference to FormatParser_Parameters containing params.
135 * @return reference to output stream for concatenation
136 */
137std::ostream & operator << (std::ostream& ost, const FormatParser_Parameters &params)
138{
139 // this is ugly, but with boost::any to safeguard const-ness is plain impossible
140 std::ostringstream output;
141 ASSERT(params.storage != NULL,
142 "operator<<(FormatParser_Parameters) - storage is NULL.");
143 for (ParameterStorage::const_iterator iter = params.storage->getBeginIter();
144 iter != params.storage->getEndIter();
145 ++iter)
146 if (!iter->second->getAsString().empty())
147 output << iter->first << "=" << iter->second->getAsString() << ";";
148 ost << output.str();
149 return ost;
150}
151
152/** Input operator for a list of parameters to place into \a params.
153 *
154 * @param ist input stream
155 * @param params parameters to parse into
156 * @return input stream for concatenation
157 */
158std::istream & operator >> (std::istream& ist, FormatParser_Parameters &params)
159{
160 typedef boost::tokenizer<boost::char_separator<char> >
161 tokenizer;
162 boost::char_separator<char> semicolonsep(";");
163 boost::char_separator<char> equalitysep("=");
164 boost::char_separator<char> ticksep("\"");
165 std::string line;
166 std::getline( ist, line );
167 //LOG(0, "INFO: full line of parameters is '" << line << "'");
168 tokenizer tokens(line, semicolonsep);
169 ASSERT(tokens.begin() != tokens.end(),
170 "operator<< on FormatParser_Parameters - empty string, need at least ';' in line "+line+"!");
171 for (tokenizer::iterator tok_iter = tokens.begin();
172 tok_iter != tokens.end(); ++tok_iter) {
173 //LOG(2, "INFO: (key,value) pair is: " << *tok_iter << ".");
174 tokenizer paramtokens(*tok_iter, equalitysep);
175 if (paramtokens.begin() != paramtokens.end()) {
176 tokenizer::iterator tok_paramiter = paramtokens.begin();
177 ASSERT(tok_paramiter != paramtokens.end(),
178 "operator<< on FormatParser_Parameters - missing value before ' =' in token "+*tok_iter+"!");
179 tokenizer::iterator tok_valueiter = tok_paramiter;
180 tokenizer::iterator tok_checkiter = ++tok_valueiter;
181 ASSERT(tok_valueiter != paramtokens.end(),
182 "operator<< on FormatParser_Parameters - missing value after ' =' in token "+*tok_iter+"!");
183 ++tok_checkiter;
184 ASSERT(tok_checkiter == paramtokens.end(),
185 "operator<< on FormatParser_Parameters - still more tokens after ' =' in token "+*tok_iter+":"
186 +*tok_checkiter+"!");
187 LOG(3, "INFO: key is '" << *tok_paramiter << "', value is '" << *tok_valueiter << "'.");
188 // TODO: throw exception instead of ASSERT
189 std::string key(*tok_paramiter);
190 std::string value(*tok_valueiter);
191 boost::trim(key);
192 boost::trim(value);
193 tokenizer ticklesstokens(value, ticksep);
194 ASSERT(ticklesstokens.begin() != ticklesstokens.end(),
195 "operator<< on FormatParser_Parameters - no tokens present after removing ticks in token "+*tok_valueiter+"!");
196 std::stringstream valuestream(*(ticklesstokens.begin()));
197 //LOG(2, "INFO: Token pair is " << key << "," << valuestream.str());
198
199 // TODO: throw exception instead of DoeLog()
200 ASSERT(params.haveParameter(key),
201 "operator >> on FormatParser_Parameters - unknown parameter name '"
202 +key+"' with value "+valuestream.str()+"!");
203 if (params.haveParameter(key)) {
204 ParameterInterface *instance = params.getParameter(key);
205 instance->setAsString(valuestream.str());
206 }
207 } else {
208 ist.setstate(std::ios::eofbit);
209 }
210 }
211 return ist;
212}
Note: See TracBrowser for help on using the repository browser.