Add error_condition::to_string

This commit is contained in:
Peter Dimov
2021-09-19 15:37:49 +03:00
parent 05581aba03
commit e3f198e52c
4 changed files with 62 additions and 11 deletions

View File

@@ -0,0 +1,32 @@
#ifndef BOOST_SYSTEM_DETAIL_APPEND_INT_HPP_INCLUDED
#define BOOST_SYSTEM_DETAIL_APPEND_INT_HPP_INCLUDED
// Copyright 2021 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt)
#include <boost/system/detail/snprintf.hpp>
#include <string>
//
namespace boost
{
namespace system
{
namespace detail
{
inline void append_int( std::string& s, int v )
{
char buffer[ 32 ];
detail::snprintf( buffer, sizeof( buffer ), ":%d", v );
s += buffer;
}
} // namespace detail
} // namespace system
} // namespace boost
#endif // #ifndef BOOST_SYSTEM_DETAIL_APPEND_INT_HPP_INCLUDED

View File

@@ -18,6 +18,7 @@
#include <boost/system/detail/interop_category.hpp> #include <boost/system/detail/interop_category.hpp>
#include <boost/system/detail/enable_if.hpp> #include <boost/system/detail/enable_if.hpp>
#include <boost/system/detail/is_same.hpp> #include <boost/system/detail/is_same.hpp>
#include <boost/system/detail/append_int.hpp>
#include <boost/system/detail/snprintf.hpp> #include <boost/system/detail/snprintf.hpp>
#include <boost/system/detail/config.hpp> #include <boost/system/detail/config.hpp>
#include <boost/assert/source_location.hpp> #include <boost/assert/source_location.hpp>
@@ -549,18 +550,18 @@ public:
{ {
std::error_code const& e2 = *reinterpret_cast<std::error_code const*>( d2_ ); std::error_code const& e2 = *reinterpret_cast<std::error_code const*>( d2_ );
char buffer[ 32 ]; std::string r( "std:" );
detail::snprintf( buffer, sizeof( buffer ), "%d", e2.value() ); r += e2.category().name();
detail::append_int( r, e2.value() );
return std::string( "std:" ) + e2.category().name() + ":" + buffer; return r;
} }
else else
#endif #endif
{ {
char buffer[ 32 ]; std::string r = category().name();
detail::snprintf( buffer, sizeof( buffer ), "%d", value() ); detail::append_int( r, value() );
return r;
return std::string( category().name() ) + ":" + buffer;
} }
} }

View File

@@ -15,6 +15,7 @@
#include <boost/system/detail/enable_if.hpp> #include <boost/system/detail/enable_if.hpp>
#include <boost/system/detail/is_same.hpp> #include <boost/system/detail/is_same.hpp>
#include <boost/system/detail/errc.hpp> #include <boost/system/detail/errc.hpp>
#include <boost/system/detail/append_int.hpp>
#include <boost/system/is_error_condition_enum.hpp> #include <boost/system/is_error_condition_enum.hpp>
#include <boost/system/detail/config.hpp> #include <boost/system/detail/config.hpp>
#include <boost/config.hpp> #include <boost/config.hpp>
@@ -246,14 +247,21 @@ public:
#endif #endif
std::string to_string() const
{
std::string r( "cond:" );
r += category().name();
detail::append_int( r, value() );
return r;
}
template<class Ch, class Tr> template<class Ch, class Tr>
inline friend std::basic_ostream<Ch, Tr>& inline friend std::basic_ostream<Ch, Tr>&
operator<< (std::basic_ostream<Ch, Tr>& os, error_condition const & en) operator<< (std::basic_ostream<Ch, Tr>& os, error_condition const & en)
{ {
{ os << en.to_string();
os << "cond:" << en.category().name() << ':' << en.value();
}
return os; return os;
} }
}; };

View File

@@ -22,6 +22,8 @@ int main()
BOOST_TEST( !en.failed() ); BOOST_TEST( !en.failed() );
BOOST_TEST( !en ); BOOST_TEST( !en );
BOOST_TEST_EQ( en.to_string(), std::string( "cond:generic:0" ) );
{ {
sys::error_condition en2( en ); sys::error_condition en2( en );
@@ -34,6 +36,8 @@ int main()
BOOST_TEST_EQ( en, en2 ); BOOST_TEST_EQ( en, en2 );
BOOST_TEST_NOT( en != en2 ); BOOST_TEST_NOT( en != en2 );
BOOST_TEST_EQ( en2.to_string(), std::string( "cond:generic:0" ) );
} }
{ {
@@ -48,6 +52,8 @@ int main()
BOOST_TEST_EQ( en, en2 ); BOOST_TEST_EQ( en, en2 );
BOOST_TEST_NOT( en != en2 ); BOOST_TEST_NOT( en != en2 );
BOOST_TEST_EQ( en2.to_string(), std::string( "cond:generic:0" ) );
} }
{ {
@@ -63,6 +69,8 @@ int main()
BOOST_TEST_NE( en, en2 ); BOOST_TEST_NE( en, en2 );
BOOST_TEST( en != en2 ); BOOST_TEST( en != en2 );
BOOST_TEST_EQ( en2.to_string(), std::string( "cond:generic:5" ) );
} }
{ {
@@ -78,6 +86,8 @@ int main()
BOOST_TEST_NE( en, en2 ); BOOST_TEST_NE( en, en2 );
BOOST_TEST( en != en2 ); BOOST_TEST( en != en2 );
BOOST_TEST_EQ( en2.to_string(), std::string( "cond:system:5" ) );
} }
return boost::report_errors(); return boost::report_errors();