/******************************************************************************** * 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 #include #include namespace fair { namespace mq { template std::ostream& operator<<(std::ostream& os, const std::vector& v) { for (const auto& i : v) { os << i << " "; } return os; } struct VarValInfo { std::string value; std::string type; std::string defaulted; }; template std::string ConvertVariableValueToString(const boost::program_options::variable_value& varVal) { std::ostringstream oss; if (auto q = boost::any_cast(&varVal.value())) { oss << *q; } return oss.str(); } namespace options { // policy to convert boost variable value into string struct ToString { using returned_type = std::string; template std::string Value(const boost::program_options::variable_value& varVal, const std::string&, const std::string&) { return ConvertVariableValueToString(varVal); } returned_type DefaultValue(const std::string&) { return std::string("[unidentified]"); } }; // policy to convert variable value content into VarValInfo struct ToVarValInfo { using returned_type = VarValInfo; template returned_type Value(const boost::program_options::variable_value& varVal, const std::string& type, const std::string& defaulted) { return VarValInfo{ConvertVariableValueToString(varVal), type, defaulted}; } returned_type DefaultValue(const std::string& defaulted) { return VarValInfo{std::string("[unidentified]"), std::string("[unidentified]"), defaulted}; } }; } // namespace options // host class that take one of the two policy defined above template struct ConvertVariableValue : T { auto operator()(const boost::program_options::variable_value& varVal) -> typename T::returned_type { std::string defaulted; if (varVal.defaulted()) { defaulted = " [default]"; } else { defaulted = " [provided]"; } if (typeid(std::string) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(int) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(float) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(double) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(short) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(long) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(std::size_t) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(std::uint32_t) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(std::uint64_t) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(bool) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); if (typeid(boost::filesystem::path) == varVal.value().type()) return T::template Value(varVal, std::string(""), defaulted); if (typeid(std::vector) == varVal.value().type()) return T::template Value>(varVal, std::string(">"), defaulted); // if we get here, the type is not supported return unknown info return T::DefaultValue(defaulted); } }; } // namespace mq } // namespace fair #endif /* FAIRPROGOPTIONSHELPER_H */