19#ifndef itkParameterMapInterface_h
20#define itkParameterMapInterface_h
25#include "itkObjectFactory.h"
27#include "itkNumericTraits.h"
115 itkSetMacro(PrintErrorMessages,
bool);
116 itkGetConstMacro(PrintErrorMessages,
bool);
143 template <
typename T>
146 const std::string & parameterName,
147 const unsigned int entry_nr,
148 const bool produceWarningMessage,
149 std::string & warningMessage)
const
158 if (numberOfEntries == 0)
162 std::ostringstream outputStringStream;
163 outputStringStream <<
"WARNING: The parameter \"" << parameterName <<
"\", requested at entry number "
164 << entry_nr <<
", does not exist at all.\n"
165 <<
" The default value \"" << parameterValue <<
"\" is used instead.";
166 warningMessage = outputStringStream.str();
176 if (entry_nr >= numberOfEntries)
180 std::ostringstream outputStringStream;
181 outputStringStream <<
"WARNING: The parameter \"" << parameterName <<
"\" does not exist at entry number "
182 << entry_nr <<
".\n The default value \"" << parameterValue <<
"\" is used instead.";
183 warningMessage = outputStringStream.str();
194 itkExceptionMacro(
"ERROR: Casting entry number "
195 << entry_nr <<
" for the parameter \"" << parameterName <<
"\" failed!\n"
196 <<
" You tried to cast \"" << vec[entry_nr] <<
"\" from std::string to "
197 <<
typeid(parameterValue).name() <<
'\n');
208 const std::string & parameterName,
209 const unsigned int entry_nr,
210 const bool produceWarningMessage,
211 std::string & warningMessage)
const;
216 template <
typename T>
219 const std::string & parameterName,
220 const unsigned int entry_nr,
221 std::string & warningMessage)
const
223 return this->
ReadParameter(parameterValue, parameterName, entry_nr,
true, warningMessage);
232 template <
typename T>
235 const std::string & parameterName,
236 const std::string & prefix,
237 const unsigned int entry_nr,
238 const int default_entry_nr,
239 const bool produceWarningMessage,
240 std::string & warningMessage)
const
242 std::string fullname = prefix + parameterName;
246 std::string dummyString =
"";
247 if (default_entry_nr >= 0)
250 auto uintdefault =
static_cast<unsigned int>(default_entry_nr);
251 found |= this->
ReadParameter(parameterValue, parameterName, uintdefault,
false, dummyString);
252 found |= this->
ReadParameter(parameterValue, parameterName, entry_nr,
false, dummyString);
253 found |= this->
ReadParameter(parameterValue, fullname, uintdefault,
false, dummyString);
254 found |= this->
ReadParameter(parameterValue, fullname, entry_nr,
false, dummyString);
259 found |= this->
ReadParameter(parameterValue, parameterName, entry_nr,
false, dummyString);
260 found |= this->
ReadParameter(parameterValue, fullname, entry_nr,
false, dummyString);
268 return this->
ReadParameter(parameterValue, parameterName, entry_nr,
true, warningMessage);
278 template <
typename T>
281 const std::string & parameterName,
282 const std::string & prefix,
283 const unsigned int entry_nr,
284 const unsigned int default_entry_nr,
285 std::string & warningMessage)
const
287 return this->
ReadParameter(parameterValue, parameterName, prefix, entry_nr, default_entry_nr,
true, warningMessage);
292 template <
typename T>
295 const std::string & parameterName,
296 const unsigned int entry_nr_start,
297 const unsigned int entry_nr_end,
298 const bool produceWarningMessage,
299 std::string & warningMessage)
const
308 if (numberOfEntries == 0)
312 std::ostringstream outputStringStream;
313 outputStringStream <<
"WARNING: The parameter \"" << parameterName <<
"\", requested between entry numbers "
314 << entry_nr_start <<
" and " << entry_nr_end <<
", does not exist at all.\n"
315 <<
" The default values are used instead.";
316 warningMessage = outputStringStream.str();
322 if (entry_nr_start > entry_nr_end)
325 itkExceptionMacro(
"WARNING: The entry number start ("
326 << entry_nr_start <<
") should be smaller than entry number end (" << entry_nr_end
327 <<
"). It was requested for parameter \"" << parameterName <<
"\".\n");
331 if (entry_nr_end >= numberOfEntries)
333 itkExceptionMacro(
"WARNING: The parameter \"" << parameterName <<
"\" does not exist at entry number "
334 << entry_nr_end <<
".\nThe default value \"" << T{}
335 <<
"\" is used instead.");
349 for (
unsigned int i = entry_nr_start; i < entry_nr_end + 1; ++i)
358 itkExceptionMacro(
"ERROR: Casting entry number "
359 << i <<
" for the parameter \"" << parameterName <<
"\" failed!\n"
360 <<
" You tried to cast \"" << vec[i] <<
"\" from std::string to "
361 <<
typeid(parameterValues[0]).name() <<
'\n');
372 const std::string & parameterName,
373 const unsigned int entry_nr_start,
374 const unsigned int entry_nr_end,
375 const bool produceWarningMessage,
376 std::string & warningMessage)
const;
380 std::vector<std::string>
384 return (found ==
m_ParameterMap.cend()) ? std::vector<std::string>{} : found->second;
391 template <
typename T>
392 std::unique_ptr<std::vector<T>>
400 std::vector<T> result;
401 result.reserve(found->second.size());
403 for (
const std::string & str : found->second)
409 result.push_back(value);
413 const auto entry_nr = &str - found->second.data();
414 itkExceptionMacro(
"Failed to cast parameter \"" << parameterName <<
"\" entry number " << entry_nr
415 <<
" value \"" << str <<
"\" to type \"" <<
typeid(T).name()
419 return std::make_unique<std::vector<T>>(std::move(result));
static bool StringToValue(const std::string &str, T &value)
std::map< std::string, ParameterValuesType > ParameterMapType
std::vector< std::string > ParameterValuesType
ParameterFileParser::ParameterValuesType ParameterValuesType
bool ReadParameter(T ¶meterValue, const std::string ¶meterName, const unsigned int entry_nr, const bool produceWarningMessage, std::string &warningMessage) const
bool ReadParameter(bool ¶meterValue, const std::string ¶meterName, const unsigned int entry_nr, const bool produceWarningMessage, std::string &warningMessage) const
const ParameterMapType & GetParameterMap() const
bool m_PrintErrorMessages
ParameterMapType m_ParameterMap
void SetParameterMap(const ParameterMapType &parMap)
itkOverrideGetNameOfClassMacro(ParameterMapInterface)
ITK_DISALLOW_COPY_AND_MOVE(ParameterMapInterface)
ParameterMapInterface Self
~ParameterMapInterface() override
std::vector< std::string > GetValues(const std::string ¶meterName) const
bool HasParameter(const std::string ¶meterName) const
ParameterFileParser::ParameterMapType ParameterMapType
bool ReadParameter(T ¶meterValue, const std::string ¶meterName, const std::string &prefix, const unsigned int entry_nr, const int default_entry_nr, const bool produceWarningMessage, std::string &warningMessage) const
std::vcl_size_t CountNumberOfParameterEntries(const std::string ¶meterName) const
bool ReadParameter(std::vector< std::string > ¶meterValues, const std::string ¶meterName, const unsigned int entry_nr_start, const unsigned int entry_nr_end, const bool produceWarningMessage, std::string &warningMessage) const
bool ReadParameter(std::vector< T > ¶meterValues, const std::string ¶meterName, const unsigned int entry_nr_start, const unsigned int entry_nr_end, const bool produceWarningMessage, std::string &warningMessage) const
SmartPointer< Self > Pointer
std::unique_ptr< std::vector< T > > RetrieveValues(const std::string ¶meterName) const
SmartPointer< const Self > ConstPointer
bool ReadParameter(T ¶meterValue, const std::string ¶meterName, const std::string &prefix, const unsigned int entry_nr, const unsigned int default_entry_nr, std::string &warningMessage) const
bool ReadParameter(T ¶meterValue, const std::string ¶meterName, const unsigned int entry_nr, std::string &warningMessage) const