⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 value_semantic.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
// Copyright Vladimir Prus 2004.// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt// or copy at http://www.boost.org/LICENSE_1_0.txt)#define BOOST_PROGRAM_OPTIONS_SOURCE#include <boost/program_options/config.hpp>#include <boost/program_options/value_semantic.hpp>#include <boost/program_options/detail/convert.hpp>#include <cctype>namespace boost { namespace program_options {    using namespace std;    void     value_semantic_codecvt_helper<char>::    parse(boost::any& value_store,           const std::vector<std::string>& new_tokens,          bool utf8) const    {        if (utf8) {#ifndef BOOST_NO_STD_WSTRING            // Need to convert to local encoding.            std::vector<string> local_tokens;            for (unsigned i = 0; i < new_tokens.size(); ++i) {                std::wstring w = from_utf8(new_tokens[i]);                local_tokens.push_back(to_local_8_bit(w));            }            xparse(value_store, local_tokens);#else            boost::throw_exception(                std::runtime_error("UTF-8 conversion not supported."));#endif        } else {            // Already in local encoding, pass unmodified            xparse(value_store, new_tokens);        }            }#ifndef BOOST_NO_STD_WSTRING    void     value_semantic_codecvt_helper<wchar_t>::    parse(boost::any& value_store,           const std::vector<std::string>& new_tokens,          bool utf8) const    {        std::vector<wstring> tokens;        if (utf8) {            // Convert from utf8            for (unsigned i = 0; i < new_tokens.size(); ++i) {                tokens.push_back(from_utf8(new_tokens[i]));            }                       } else {            // Convert from local encoding            for (unsigned i = 0; i < new_tokens.size(); ++i) {                tokens.push_back(from_local_8_bit(new_tokens[i]));            }        }              xparse(value_store, tokens);      }#endif    BOOST_PROGRAM_OPTIONS_DECL std::string arg("arg");    std::string    untyped_value::name() const    {        return arg;    }        unsigned     untyped_value::min_tokens() const    {        if (m_zero_tokens)            return 0;        else            return 1;    }    unsigned     untyped_value::max_tokens() const    {        if (m_zero_tokens)            return 0;        else            return 1;    }    void     untyped_value::xparse(boost::any& value_store,                          const std::vector<std::string>& new_tokens) const    {        if (!value_store.empty())             boost::throw_exception(                multiple_occurrences("multiple_occurrences"));        if (new_tokens.size() > 1)            boost::throw_exception(multiple_values("multiple_values"));        value_store = new_tokens.empty() ? std::string("") : new_tokens.front();    }    BOOST_PROGRAM_OPTIONS_DECL typed_value<bool>*    bool_switch()    {        return bool_switch(0);    }    BOOST_PROGRAM_OPTIONS_DECL typed_value<bool>*    bool_switch(bool* v)    {        typed_value<bool>* r = new typed_value<bool>(v);        r->default_value(0);        r->zero_tokens();        return r;    }    /* Validates bool value.        Any of "1", "true", "yes", "on" will be converted to "1".<br>        Any of "0", "false", "no", "off" will be converted to "0".<br>        Case is ignored. The 'xs' vector can either be empty, in which        case the value is 'true', or can contain explicit value.    */    BOOST_PROGRAM_OPTIONS_DECL void validate(any& v, const vector<string>& xs,                       bool*, int)    {        check_first_occurrence(v);        string s(get_single_string(xs, true));        for (size_t i = 0; i < s.size(); ++i)            s[i] = char(tolower(s[i]));        if (s.empty() || s == "on" || s == "yes" || s == "1" || s == "true")            v = any(true);        else if (s == "off" || s == "no" || s == "0" || s == "false")            v = any(false);        else            boost::throw_exception(validation_error(                                "'" + s + "' doesn't look like a bool value."));    }    // This is blatant copy-paste. However, templating this will cause a problem,    // since wstring can't be constructed/compared with char*. We'd need to    // create auxiliary 'widen' routine to convert from char* into     // needed string type, and that's more work.#if !defined(BOOST_NO_STD_WSTRING)    BOOST_PROGRAM_OPTIONS_DECL     void validate(any& v, const vector<wstring>& xs, bool*, int)    {        check_first_occurrence(v);        wstring s(get_single_string(xs, true));        for (size_t i = 0; i < s.size(); ++i)            s[i] = wchar_t(tolower(s[i]));        if (s.empty() || s == L"on" || s == L"yes" || s == L"1" || s == L"true")            v = any(true);        else if (s == L"off" || s == L"no" || s == L"0" || s == L"false")            v = any(false);        else            boost::throw_exception(validation_error("invalid bool value"));    }#endif    BOOST_PROGRAM_OPTIONS_DECL     void validate(any& v, const vector<string>& xs, std::string*, int)    {        check_first_occurrence(v);        string s(get_single_string(xs));        if (!s.empty() && (                (*s.begin() == '\'' && *s.rbegin() == '\'' ||                 *s.begin() == '"' && *s.rbegin() == '"')))        {            v = any(s.substr(1, s.size()-2));        }        else            v = any(s);    }#if !defined(BOOST_NO_STD_WSTRING)    BOOST_PROGRAM_OPTIONS_DECL     void validate(any& v, const vector<wstring>& xs, std::string*, int)    {        check_first_occurrence(v);        wstring s(get_single_string(xs));        if (*s.begin() == L'\'' && *s.rbegin() == L'\'' ||            *s.begin() == L'"' && *s.rbegin() == L'"')            v = any(s.substr(1, s.size()-2));        else            v = any(s);    }#endif    namespace validators {        BOOST_PROGRAM_OPTIONS_DECL         void check_first_occurrence(const boost::any& value)        {            if (!value.empty())                boost::throw_exception(                    multiple_occurrences("multiple_occurrences"));        }    }    invalid_option_value::    invalid_option_value(const std::string& bad_value)    : validation_error(string("invalid option value '")                       .append(bad_value).append("'"))    {}#ifndef BOOST_NO_STD_WSTRING    namespace    {        std::string convert_value(const std::wstring& s)        {            try {                return to_local_8_bit(s);            }            catch(const std::exception&) {                return "<unrepresentable unicode string>";            }        }    }    invalid_option_value::    invalid_option_value(const std::wstring& bad_value)    : validation_error(string("invalid option value '")                       .append(convert_value(bad_value))                       .append("'"))    {}#endif                           void validation_error::set_option_name(const std::string& option_name)    {        m_option_name = option_name;    }    const char* validation_error::what() const throw()    {        if (!m_option_name.empty())        {            m_message = "in option '" + m_option_name + "': "                 + logic_error::what();            return m_message.c_str();        }        else        {            return logic_error::what();        }    }}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -