📄 error_desc.hpp
字号:
}
else
{
cch = format_message(error, NULL, &message);
}
if(0 == cch)
{
message = NULL;
}
*length = cch;
return message;
}
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline basic_error_desc<C, T>::basic_error_desc(ss_typename_type_k basic_error_desc<C, T>::error_type error /* = ::GetLastError() */, char_type const* modulePath /* = NULL */)
: m_length(0)
, m_message(find_message_(error, modulePath, &m_length))
{
if(NULL == m_message)
{
if(0 == format_message(error, NULL, &m_message))
{
m_message = NULL;
}
}
}
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline basic_error_desc<C, T>::basic_error_desc(HRESULT hr, char_type const* modulePath /* = NULL */)
: m_length(0)
, m_message(find_message_(static_cast<DWORD>(hr), modulePath, &m_length))
{
if(NULL == m_message)
{
if(0 == format_message(static_cast<DWORD>(hr), NULL, &m_message))
{
m_message = NULL;
}
}
}
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline basic_error_desc<C, T>::~basic_error_desc() stlsoft_throw_0()
{
#ifdef STLSOFT_CF_USE_RAW_OFFSETOF_IN_STATIC_ASSERT
STLSOFT_STATIC_ASSERT(STLSOFT_RAW_OFFSETOF(class_type, m_length) < STLSOFT_RAW_OFFSETOF(class_type, m_message));
#endif /* STLSOFT_CF_USE_RAW_OFFSETOF_IN_STATIC_ASSERT */
if(m_message != NULL)
{
::LocalFree(m_message);
}
}
#if defined(STLSOFT_COMPILER_IS_GCC)
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline basic_error_desc<C, T>::basic_error_desc(ss_typename_type_k basic_error_desc<C, T>::class_type& rhs) stlsoft_throw_0()
{
m_length = rhs.m_length;
rhs.m_length = 0;
m_message = rhs.m_message;
rhs.m_message = NULL;
}
#endif /* compiler */
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline ss_typename_type_k basic_error_desc<C, T>::char_type const* basic_error_desc<C, T>::get_description() const
{
static const char_type s_nullMessage[1] = { '\0' };
return (NULL != m_message) ? m_message : s_nullMessage;
}
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline ss_typename_type_k basic_error_desc<C, T>::char_type const* basic_error_desc<C, T>::c_str() const
{
return get_description();
}
#if !defined(WINSTL_ERROR_DESC_NO_IMPLICIT_CONVERSION)
template< ss_typename_param_k C
, ss_typename_param_k T
>
#if defined(STLSOFT_COMPILER_IS_GCC)
inline basic_error_desc<C, T>::operator C const* () const
#else /* ? compiler */
inline basic_error_desc<C, T>::operator ss_typename_type_k basic_error_desc<C, T>::char_type const* () const
#endif /* compiler */
{
return get_description();
}
#endif /* !WINSTL_ERROR_DESC_NO_IMPLICIT_CONVERSION */
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline ss_typename_type_k basic_error_desc<C, T>::size_type basic_error_desc<C, T>::length() const stlsoft_throw_0()
{
return m_length;
}
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline ss_typename_type_k basic_error_desc<C, T>::size_type basic_error_desc<C, T>::size() const stlsoft_throw_0()
{
return length();
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* String access shims
*/
#ifndef STLSOFT_CF_TEMPLATE_SHIMS_NOT_SUPPORTED
/** \brief \ref group__concept__shim__string_access__c_str_ptr_null for winstl::basic_error_desc
*
* \ingroup group__concept__shim__string_access
*/
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline C const* c_str_ptr_null(winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
C const* p = e;
return ('\0' != *e) ? p : NULL;
}
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template <ss_typename_param_k T>
inline ws_char_a_t const* c_str_ptr_null_a(winstl_ns_qual(basic_error_desc)<ws_char_a_t, T> const& e)
{
ws_char_a_t const* p = e;
return ('\0' != *e) ? p : NULL;
}
template <ss_typename_param_k T>
inline ws_char_w_t const* c_str_ptr_null_w(winstl_ns_qual(basic_error_desc)<ws_char_w_t, T> const& e)
{
ws_char_w_t const* p = e;
return (L'\0' != *e) ? p : NULL;
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/** \brief \ref group__concept__shim__string_access__c_str_ptr for winstl::basic_error_desc
*
* \ingroup group__concept__shim__string_access
*/
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline C const* c_str_ptr(winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
return e.c_str();
}
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template <ss_typename_param_k T>
inline ws_char_a_t const* c_str_ptr_a(winstl_ns_qual(basic_error_desc)<ws_char_a_t, T> const& e)
{
return e.c_str();
}
template <ss_typename_param_k T>
inline ws_char_w_t const* c_str_ptr_w(winstl_ns_qual(basic_error_desc)<ws_char_w_t, T> const& e)
{
return e.c_str();
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/** \brief \ref group__concept__shim__string_access__c_str_data for winstl::basic_error_desc
*
* \ingroup group__concept__shim__string_access
*/
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline C const* c_str_data(winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
return e.c_str();
}
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template <ss_typename_param_k T>
inline ws_char_a_t const* c_str_data_a(winstl_ns_qual(basic_error_desc)<ws_char_a_t, T> const& e)
{
return e.c_str();
}
template <ss_typename_param_k T>
inline ws_char_w_t const* c_str_data_w(winstl_ns_qual(basic_error_desc)<ws_char_w_t, T> const& e)
{
return e.c_str();
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/** \brief \ref group__concept__shim__string_access__c_str_len for winstl::basic_error_desc
*
* \ingroup group__concept__shim__string_access
*/
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline ws_size_t c_str_len(winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
return e.length();
}
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template< ss_typename_param_k T
>
inline ws_size_t c_str_len_a(winstl_ns_qual(basic_error_desc)<ws_char_a_t, T> const& e)
{
return e.length();
}
template< ss_typename_param_k T
>
inline ws_size_t c_str_len_w(winstl_ns_qual(basic_error_desc)<ws_char_w_t, T> const& e)
{
return e.length();
}
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/** [DEPRECATED] \ref group__concept__shim__pointer_attribute__get_ptr for winstl::basic_error_desc
*
* \deprecated get_ptr is for pointers and "smart pointers".
*/
template< ss_typename_param_k C
, ss_typename_param_k T
>
inline C const* get_ptr(winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
return e;
}
/** \brief \ref group__concept__shim__stream_insertion "stream insertion shim" for winstl::basic_error_desc
*
* \ingroup group__concept__shim__stream_insertion
*/
template< ss_typename_param_k S
, ss_typename_param_k C
, ss_typename_param_k T
>
inline S& operator <<(S& s, winstl_ns_qual(basic_error_desc)<C, T> const& e)
{
s << e.get_description();
return s;
}
#endif /* !STLSOFT_CF_TEMPLATE_SHIMS_NOT_SUPPORTED */
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/error_desc_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* ////////////////////////////////////////////////////////////////////// */
#ifndef _WINSTL_NO_NAMESPACE
# if defined(_STLSOFT_NO_NAMESPACE) || \
defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
} // namespace winstl
# else
} // namespace winstl_project
} // namespace stlsoft
# endif /* _STLSOFT_NO_NAMESPACE */
#endif /* !_WINSTL_NO_NAMESPACE */
/* /////////////////////////////////////////////////////////////////////////
* Namespace
*
* The string access shims exist either in the stlsoft namespace, or in the
* global namespace. This is required by the lookup rules.
*
*/
#ifndef _WINSTL_NO_NAMESPACE
# if !defined(_STLSOFT_NO_NAMESPACE) && \
!defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
namespace stlsoft
{
# else /* ? _STLSOFT_NO_NAMESPACE */
/* There is no stlsoft namespace, so must define in the global namespace */
# endif /* !_STLSOFT_NO_NAMESPACE */
using ::winstl::c_str_data;
using ::winstl::c_str_data_a;
using ::winstl::c_str_data_w;
using ::winstl::c_str_len;
using ::winstl::c_str_len_a;
using ::winstl::c_str_len_w;
using ::winstl::c_str_ptr;
using ::winstl::c_str_ptr_a;
using ::winstl::c_str_ptr_w;
using ::winstl::c_str_ptr_null;
using ::winstl::c_str_ptr_null_a;
using ::winstl::c_str_ptr_null_w;
using ::winstl::get_ptr;
# if !defined(_STLSOFT_NO_NAMESPACE) && \
!defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
} // namespace stlsoft
# else /* ? _STLSOFT_NO_NAMESPACE */
/* There is no stlsoft namespace, so must define in the global namespace */
# endif /* !_STLSOFT_NO_NAMESPACE */
#endif /* !_WINSTL_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* WINSTL_INCL_WINSTL_ERROR_HPP_ERROR_DESC */
/* ////////////////////////////////////////////////////////////////////// */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -