/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2010-2012 University of Bonn. All rights reserved.
*
*
* This file is part of MoleCuilder.
*
* MoleCuilder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* MoleCuilder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MoleCuilder. If not, see .
*/
/*
* CommandLineParser_validate.cpp
*
* Created on: Nov 8, 2010
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
//#include "CodePatterns/MemDebug.hpp"
#include
#include
#include
#include "Actions/Values.hpp"
#include "CommandLineParser_validate.hpp"
#include "Parameters/Specifics/KeyValuePair.hpp"
/** boost::program_options validator specialization for VectorValue.
* \param &v reference for return value
* \param &values string vector of scanned options
* \param *
* \param
*
*/
void validate(boost::any& v, const std::vector& values, VectorValue *, int)
{
VectorValue VV;
std::vector components;
// split comma-separated values
if (values.size() != 1) {
std::cerr << "Not one vector but " << values.size() << " given " << std::endl;
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Unequal to one vector given");
#else
throw boost::program_options::validation_error(
boost::program_options::validation_error::invalid_option_value,
std::string("value"),
std::string("VectorValue")
);
#endif
}
VV.vectorstring = values.at(0);
v = boost::any(VectorValue(VV));
}
void validate(boost::any& v, const std::vector& values, RealSpaceMatrixValue *, int)
{
RealSpaceMatrixValue RSMV;
std::vector components;
// split comma-separated values
if (values.size() != 1) {
std::cerr << "Not one vector but " << values.size() << " given " << std::endl;
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Unequal to one vector given");
#else
throw boost::program_options::validation_error(
boost::program_options::validation_error::invalid_option_value,
std::string("value"),
std::string("BoxValue")
);
#endif
}
std::string argument(values.at(0));
std::string::iterator Aiter = argument.begin();
std::string::iterator Biter = argument.begin();
for (; Aiter != argument.end(); ++Aiter) {
if (*Aiter == ',') {
components.push_back(std::string(Biter,Aiter));
do {
Aiter++;
} while (*Aiter == ' ' || *Aiter == '\t');
Biter = Aiter;
}
}
components.push_back(std::string(Biter,argument.end()));
if (components.size() != 6) {
std::cerr << "Specified vector does not have three components but " << components.size() << std::endl;
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Specified symmetric box matrix does not have six components");
#else
throw boost::program_options::validation_error(
boost::program_options::validation_error::invalid_option_value,
std::string("value"),
std::string("BoxValue")
);
#endif
}
for (size_t i=0;i<(NDIM*(NDIM+1))/2; ++i)
RSMV.matrix[i] = boost::lexical_cast(components.at(i));
v = boost::any(RealSpaceMatrixValue(RSMV));
}
/** boost::program_options validator specialization for boost::filesystem::path.
* \param &v reference for return value
* \param &values string vector of scanned options
* \param *
* \param
*
*/
void validate(boost::any& v, const std::vector& values, boost::filesystem::path *, int)
{
// std::cerr << "boost::filesystem::path validator used." << std::endl;
// Make sure no previous assignment to 'a' was made.
boost::program_options::validators::check_first_occurrence(v);
// Extract the first string from 'values'. If there is more than
// one string, it's an error, and exception will be thrown.
const std::string& s = boost::program_options::validators::get_single_string(values);
v = boost::any(boost::filesystem::path(s));
}
/** boost::program_options validator specialization for boost::filesystem::path.
* \param &v reference for return value
* \param &values string vector of scanned options
* \param *
* \param
*
*/
void validate(boost::any& v, const std::vector& values, KeyValuePair *, int)
{
// std::cerr << "KeyValuePair validator used." << std::endl;
// Make sure no previous assignment to 'a' was made.
boost::program_options::validators::check_first_occurrence(v);
// Extract the first string from 'values'. If there is more than
// one string, it's an error, and exception will be thrown.
const std::string& s = boost::program_options::validators::get_single_string(values);
if (s.find("=") == std::string::npos) {
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Invalid KeyValue given");
#else
throw boost::program_options::validation_error(
boost::program_options::validation_error::invalid_option_value,
std::string("value"),
std::string("vector")
);
#endif
}
v = boost::any(KeyValuePair(s));
}
/** boost::program_options validator specialization for boost::filesystem::path.
* \param &v reference for return value
* \param &values string vector of scanned options
* \param *
* \param
*
*/
void validate(boost::any& v, const std::vector& values, std::vector *, int)
{
// std::cerr << "vector validator used." << std::endl;
// split comma-separated values
if (values.size() > 1) {
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Unequal to one file given");
#else
if (values.size() == 0) {
throw boost::program_options::validation_error(
boost::program_options::validation_error::at_least_one_value_required,
std::string("value"),
std::string("vector")
);
}
#endif
for (std::vector::const_iterator iter = values.begin();
iter != values.end();++iter)
if ((*iter).find("=") == std::string::npos) {
#if BOOST_VERSION < 104200
throw boost::program_options::validation_error("Invalid KeyValue given");
#else
throw boost::program_options::validation_error(
boost::program_options::validation_error::invalid_option_value,
std::string("value"),
std::string("vector")
);
#endif
}
}
std::vector temp;
for (std::vector::const_iterator iter = values.begin();
iter != values.end();++iter)
temp.push_back(KeyValuePair(*iter));
v = boost::any(temp);
}