x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
value_semantic.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\program_options\detail\value_semantic.hpp
旋转
特效
属性
历史版本
// 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) // This file defines template functions that are declared in // ../value_semantic.hpp. #include
namespace boost { namespace program_options { extern BOOST_PROGRAM_OPTIONS_DECL std::string arg; template
std::string typed_value
::name() const { if (!m_implicit_value.empty() && !m_implicit_value_as_text.empty()) { std::string msg = "[=arg(=" + m_implicit_value_as_text + ")]"; if (!m_default_value.empty() && !m_default_value_as_text.empty()) msg += " (=" + m_default_value_as_text + ")"; return msg; } else if (!m_default_value.empty() && !m_default_value_as_text.empty()) { return arg + " (=" + m_default_value_as_text + ")"; } else { return arg; } } template
void typed_value
::notify(const boost::any& value_store) const { const T* value = boost::any_cast
(&value_store); if (m_store_to) { *m_store_to = *value; } if (m_notifier) { m_notifier(*value); } } namespace validators { /* If v.size() > 1, throw validation_error. If v.size() == 1, return v.front() Otherwise, returns a reference to a statically allocated empty string if 'allow_empty' and throws validation_error otherwise. */ template
const std::basic_string
& get_single_string( const std::vector
>& v, bool allow_empty = false) { static std::basic_string
empty; if (v.size() > 1) throw validation_error("multiple values not allowed"); if (v.size() == 1) return v.front(); else if (allow_empty) return empty; else throw validation_error("at least one value required"); } /* Throws multiple_occurrences if 'value' is not empty. */ BOOST_PROGRAM_OPTIONS_DECL void check_first_occurrence(const boost::any& value); } using namespace validators; /** Validates 's' and updates 'v'. @pre 'v' is either empty or in the state assigned by the previous invocation of 'validate'. The target type is specified via a parameter which has the type of pointer to the desired type. This is workaround for compilers without partial template ordering, just like the last 'long/int' parameter. */ template
void validate(boost::any& v, const std::vector< std::basic_string
>& xs, T*, long) { validators::check_first_occurrence(v); std::basic_string
s(validators::get_single_string(xs)); try { v = any(lexical_cast
(s)); } catch(const bad_lexical_cast&) { boost::throw_exception(invalid_option_value(s)); } } BOOST_PROGRAM_OPTIONS_DECL void validate(boost::any& v, const std::vector
& xs, bool*, int); #if !defined(BOOST_NO_STD_WSTRING) BOOST_PROGRAM_OPTIONS_DECL void validate(boost::any& v, const std::vector
& xs, bool*, int); #endif // For some reason, this declaration, which is require by the standard, // cause gcc 3.2 to not generate code to specialization defined in // value_semantic.cpp #if ! ( ( BOOST_WORKAROUND(__GNUC__, <= 3) &&\ BOOST_WORKAROUND(__GNUC_MINOR__, < 3) ) || \ ( BOOST_WORKAROUND(BOOST_MSVC, == 1310) ) \ ) BOOST_PROGRAM_OPTIONS_DECL void validate(boost::any& v, const std::vector
& xs, std::string*, int); #if !defined(BOOST_NO_STD_WSTRING) BOOST_PROGRAM_OPTIONS_DECL void validate(boost::any& v, const std::vector
& xs, std::string*, int); #endif #endif /** Validates sequences. Allows multiple values per option occurrence and multiple occurrences. */ template
void validate(boost::any& v, const std::vector
>& s, std::vector
*, int) { if (v.empty()) { v = boost::any(std::vector
()); } std::vector
* tv = boost::any_cast< std::vector
>(&v); assert(NULL != tv); for (unsigned i = 0; i < s.size(); ++i) { try { /* We call validate so that if user provided a validator for class T, we use it even when parsing vector
. */ boost::any a; std::vector
> v; v.push_back(s[i]); validate(a, v, (T*)0, 0); tv->push_back(boost::any_cast
(a)); } catch(const bad_lexical_cast& /*e*/) { boost::throw_exception(invalid_option_value(s[i])); } } } template
void typed_value
:: xparse(boost::any& value_store, const std::vector
>& new_tokens) const { // If no tokens were given, and the option accepts an implicit // value, then assign the implicit value as the stored value; // otherwise, validate the user-provided token(s). if (new_tokens.empty() && !m_implicit_value.empty()) value_store = m_implicit_value; else validate(value_store, new_tokens, (T*)0, 0); } template
typed_value
* value() { // Explicit qualification is vc6 workaround. return boost::program_options::value
(0); } template
typed_value
* value(T* v) { typed_value
* r = new typed_value
(v); return r; } template
typed_value
* wvalue() { return wvalue
(0); } template
typed_value
* wvalue(T* v) { typed_value
* r = new typed_value
(v); return r; } }}
value_semantic.hpp
网页地址
文件地址
上一页
6/6 下一页
下载
( 6 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.