From cc2b081a9e68a7590e3732fd9769f098f1154acb Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 27 Aug 2020 03:38:30 +0300 Subject: [PATCH] Add boost/system/error_category.hpp --- include/boost/system/error_category.hpp | 13 ++++ test/Jamfile.v2 | 1 + test/error_category_test2.cpp | 79 +++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 include/boost/system/error_category.hpp create mode 100644 test/error_category_test2.cpp diff --git a/include/boost/system/error_category.hpp b/include/boost/system/error_category.hpp new file mode 100644 index 0000000..5b6199b --- /dev/null +++ b/include/boost/system/error_category.hpp @@ -0,0 +1,13 @@ +#ifndef BOOST_SYSTEM_ERROR_CATEGORY_HPP_INCLUDED +#define BOOST_SYSTEM_ERROR_CATEGORY_HPP_INCLUDED + +// Copyright 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0 +// http://www.boost.org/LICENSE_1_0.txt +// +// See library home page at http://www.boost.org/libs/system + +#include +#include + +#endif // #ifndef BOOST_SYSTEM_ERROR_CATEGORY_HPP_INCLUDED diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index bd13f3d..8d7d5f5 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -77,3 +77,4 @@ run std_single_instance_test.cpp std_single_instance_lib1 std_single_instance_li run is_error_code_enum_test.cpp ; run is_error_condition_enum_test.cpp ; run errc_test.cpp ; +run error_category_test2.cpp ; diff --git a/test/error_category_test2.cpp b/test/error_category_test2.cpp new file mode 100644 index 0000000..72c200f --- /dev/null +++ b/test/error_category_test2.cpp @@ -0,0 +1,79 @@ + +// Copyright 2018, 2020 Peter Dimov. +// +// 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 + +// See library home page at http://www.boost.org/libs/system + +// Avoid spurious VC++ warnings +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +// + +namespace sys = boost::system; + +class user_category: public sys::error_category +{ +public: + + virtual const char * name() const BOOST_NOEXCEPT + { + return "user"; + } + + virtual std::string message( int ev ) const + { + char buffer[ 256 ]; + std::sprintf( buffer, "user message %d", ev ); + + return buffer; + } + + using sys::error_category::message; +}; + +static user_category s_cat_1; +static user_category s_cat_2; + +int main() +{ + // default_error_condition + + BOOST_TEST( s_cat_1.default_error_condition( 1 ).value() == 1 ); + BOOST_TEST( s_cat_1.default_error_condition( 1 ).category() == s_cat_1 ); + + BOOST_TEST( s_cat_2.default_error_condition( 2 ).value() == 2 ); + BOOST_TEST( s_cat_2.default_error_condition( 2 ).category() == s_cat_2 ); + + // equivalent + + BOOST_TEST( s_cat_1.equivalent( 1, s_cat_1.default_error_condition( 1 ) ) ); + BOOST_TEST( !s_cat_1.equivalent( 1, s_cat_1.default_error_condition( 2 ) ) ); + BOOST_TEST( !s_cat_1.equivalent( 1, s_cat_2.default_error_condition( 2 ) ) ); + + // message + + { + char buffer[ 256 ]; + BOOST_TEST_CSTR_EQ( s_cat_1.message( 1, buffer, sizeof( buffer ) ), s_cat_1.message( 1 ).c_str() ); + } + + { + char buffer[ 4 ]; + BOOST_TEST_CSTR_EQ( s_cat_1.message( 1, buffer, sizeof( buffer ) ), "use" ); + } + + // == + + BOOST_TEST_NOT( s_cat_1 == s_cat_2 ); + BOOST_TEST( s_cat_1 != s_cat_2 ); + + return boost::report_errors(); +}