/******************************************************************************** * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ /* * File: FairProgOptionsHelper.h * Author: winckler * * Created on March 11, 2015, 5:38 PM */ #ifndef FAIRPROGOPTIONSHELPER_H #define FAIRPROGOPTIONSHELPER_H #include #include #include #include #include #include #include namespace fair { namespace mq { struct VarValInfo { std::string value; std::string type; std::string defaulted; std::string empty; }; template std::ostream& operator<<(std::ostream& os, const std::vector& v) { std::copy(v.begin(), v.end(), std::ostream_iterator(os, " ")); return os; } template bool typeIs(const boost::program_options::variable_value& varValue) { auto& value = varValue.value(); if (auto q = boost::any_cast(&value)) { return true; } else { return false; } } template std::string ConvertVariableValueToString(const boost::program_options::variable_value& varValue) { auto& value = varValue.value(); std::ostringstream ostr; if (auto q = boost::any_cast(&value)) { ostr << *q; } std::string valueStr = ostr.str(); return valueStr; } // string specialization template<> inline std::string ConvertVariableValueToString(const boost::program_options::variable_value& varValue) { auto& value = varValue.value(); std::string valueStr; if (auto q = boost::any_cast(&value)) { valueStr = *q; } return valueStr; } // boost::filesystem::path specialization template<> inline std::string ConvertVariableValueToString(const boost::program_options::variable_value& varValue) { auto& value = varValue.value(); std::string valueStr; if (auto q = boost::any_cast(&value)) { valueStr = (*q).string(); } return valueStr; } // policy to convert boost variable value into string struct VarInfoToString { using returned_type = std::string; template std::string Value(const boost::program_options::variable_value& varValue, const std::string&, const std::string&, const std::string&) { return ConvertVariableValueToString(varValue); } returned_type DefaultValue(const std::string&, const std::string&) { return std::string("empty value"); } }; // policy to convert variable value content into VarValInfo struct ToVarValInfo { using returned_type = fair::mq::VarValInfo; template returned_type Value(const boost::program_options::variable_value& varValue, const std::string& type, const std::string& defaulted, const std::string& empty) { std::string valueStr = ConvertVariableValueToString(varValue); return fair::mq::VarValInfo{valueStr, type, defaulted, empty}; } returned_type DefaultValue(const std::string& defaulted, const std::string& empty) { return fair::mq::VarValInfo{std::string("Unknown value"), std::string(" [Unknown]"), defaulted, empty}; } }; // host class that take one of the two policy defined above template struct ConvertVariableValue : T { auto operator()(const boost::program_options::variable_value& varValue) -> typename T::returned_type { std::string defaulted; std::string empty; if (varValue.empty()) { empty = " [empty]"; } else { if (varValue.defaulted()) { defaulted = " [default]"; } else { defaulted = " [provided]"; } } if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); if (typeIs>(varValue)) return T::template Value>(varValue, std::string(">"), defaulted, empty); if (typeIs(varValue)) return T::template Value(varValue, std::string(""), defaulted, empty); // if we get here, the type is not supported return unknown info return T::DefaultValue(defaulted, empty); } }; } // namespace mq } // namespace fair #endif /* FAIRPROGOPTIONSHELPER_H */