forked from boostorg/system
Merge branch 'develop' into feature/use-utf8
This commit is contained in:
39
appveyor.yml
39
appveyor.yml
@ -1,4 +1,4 @@
|
|||||||
# Copyright 2016, 2017 Peter Dimov
|
# Copyright 2016-2018 Peter Dimov
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
@ -15,48 +15,30 @@ branches:
|
|||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||||
TOOLSET: msvc-9.0
|
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
|
||||||
TOOLSET: msvc-10.0
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
|
||||||
TOOLSET: msvc-11.0
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
|
||||||
TOOLSET: msvc-12.0
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
TOOLSET: msvc-14.0
|
TOOLSET: msvc-14.0
|
||||||
|
ADDRMD: 32,64
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
TOOLSET: msvc-14.1
|
TOOLSET: msvc-14.1
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
CXXSTD: 14,17
|
||||||
TOOLSET: msvc-14.1
|
ADDRMD: 32,64
|
||||||
CXXSTD: 17
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||||
ADDPATH: C:\cygwin\bin;
|
ADDPATH: C:\cygwin\bin;
|
||||||
TOOLSET: gcc
|
TOOLSET: gcc
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
CXXSTD: 03,11,14,1z
|
||||||
ADDPATH: C:\cygwin\bin;
|
|
||||||
TOOLSET: gcc
|
|
||||||
CXXSTD: 03,11
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||||
ADDPATH: C:\cygwin64\bin;
|
ADDPATH: C:\cygwin64\bin;
|
||||||
TOOLSET: gcc
|
TOOLSET: gcc
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
CXXSTD: 03,11,14,1z
|
||||||
ADDPATH: C:\cygwin64\bin;
|
|
||||||
TOOLSET: gcc
|
|
||||||
CXXSTD: 03,11
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||||
ADDPATH: C:\mingw\bin;
|
ADDPATH: C:\mingw\bin;
|
||||||
TOOLSET: gcc
|
TOOLSET: gcc
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
CXXSTD: 03,11,14,1z
|
||||||
ADDPATH: C:\mingw\bin;
|
|
||||||
TOOLSET: gcc
|
|
||||||
CXXSTD: 03,11
|
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
||||||
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||||
TOOLSET: gcc
|
TOOLSET: gcc
|
||||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
|
CXXSTD: 03,11,14,1z
|
||||||
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
|
||||||
TOOLSET: gcc
|
|
||||||
CXXSTD: 03,11
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- set BOOST_BRANCH=develop
|
- set BOOST_BRANCH=develop
|
||||||
@ -77,4 +59,5 @@ build: off
|
|||||||
test_script:
|
test_script:
|
||||||
- PATH=%ADDPATH%%PATH%
|
- PATH=%ADDPATH%%PATH%
|
||||||
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
|
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
|
||||||
- b2 -j3 libs/system/test toolset=%TOOLSET% variant=debug,release %CXXSTD%
|
- if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
|
||||||
|
- b2 -j3 libs/system/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release
|
||||||
|
@ -33,6 +33,10 @@
|
|||||||
# define BOOST_SYSTEM_HAS_CONSTEXPR
|
# define BOOST_SYSTEM_HAS_CONSTEXPR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if BOOST_WORKAROUND(BOOST_GCC, < 60000)
|
||||||
|
# undef BOOST_SYSTEM_HAS_CONSTEXPR
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(BOOST_SYSTEM_HAS_CONSTEXPR)
|
#if defined(BOOST_SYSTEM_HAS_CONSTEXPR)
|
||||||
# define BOOST_SYSTEM_CONSTEXPR constexpr
|
# define BOOST_SYSTEM_CONSTEXPR constexpr
|
||||||
#else
|
#else
|
||||||
|
@ -196,9 +196,12 @@ protected:
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
~error_category()
|
// We'd like to make the destructor protected, to make code that deletes
|
||||||
{
|
// an error_category* not compile; unfortunately, doing the below makes
|
||||||
}
|
// the destructor user-provided and hence breaks use after main, as the
|
||||||
|
// categories may get destroyed before code that uses them
|
||||||
|
|
||||||
|
// ~error_category() {}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -221,6 +224,8 @@ public:
|
|||||||
virtual std::string message( int ev ) const = 0;
|
virtual std::string message( int ev ) const = 0;
|
||||||
virtual char const * message( int ev, char * buffer, std::size_t len ) const BOOST_NOEXCEPT;
|
virtual char const * message( int ev, char * buffer, std::size_t len ) const BOOST_NOEXCEPT;
|
||||||
|
|
||||||
|
virtual bool failed( int ev ) const BOOST_NOEXCEPT;
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR bool operator==( const error_category & rhs ) const BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR bool operator==( const error_category & rhs ) const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return rhs.id_ == 0? this == &rhs: id_ == rhs.id_;
|
return rhs.id_ == 0? this == &rhs: id_ == rhs.id_;
|
||||||
@ -378,6 +383,31 @@ template<class T> struct enable_if<false, T>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// failed_impl
|
||||||
|
|
||||||
|
#if !defined(BOOST_SYSTEM_HAS_CONSTEXPR)
|
||||||
|
|
||||||
|
inline bool failed_impl( int ev, error_category const & cat )
|
||||||
|
{
|
||||||
|
return cat.failed( ev );
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
BOOST_SYSTEM_CONSTEXPR inline bool failed_impl( int ev, error_category const & cat )
|
||||||
|
{
|
||||||
|
if( cat == system_category() || cat == generic_category() )
|
||||||
|
{
|
||||||
|
return ev != 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return cat.failed( ev );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
// class error_condition
|
// class error_condition
|
||||||
@ -388,18 +418,21 @@ class error_condition
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int m_val;
|
int val_;
|
||||||
error_category const * m_cat;
|
bool failed_;
|
||||||
|
error_category const * cat_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// constructors:
|
// constructors:
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR error_condition() BOOST_NOEXCEPT: m_val( 0 ), m_cat( &generic_category() )
|
BOOST_SYSTEM_CONSTEXPR error_condition() BOOST_NOEXCEPT:
|
||||||
|
val_( 0 ), failed_( false ), cat_( &generic_category() )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR error_condition( int val, const error_category & cat ) BOOST_NOEXCEPT: m_val( val ), m_cat( &cat )
|
BOOST_SYSTEM_CONSTEXPR error_condition( int val, const error_category & cat ) BOOST_NOEXCEPT:
|
||||||
|
val_( val ), failed_( detail::failed_impl( val, cat ) ), cat_( &cat )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,8 +446,9 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR void assign( int val, const error_category & cat ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR void assign( int val, const error_category & cat ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
m_val = val;
|
val_ = val;
|
||||||
m_cat = &cat;
|
failed_ = detail::failed_impl( val, cat );
|
||||||
|
cat_ = &cat;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ErrorConditionEnum>
|
template<typename ErrorConditionEnum>
|
||||||
@ -427,37 +461,43 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR void clear() BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR void clear() BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
m_val = 0;
|
val_ = 0;
|
||||||
m_cat = &generic_category();
|
failed_ = false;
|
||||||
|
cat_ = &generic_category();
|
||||||
}
|
}
|
||||||
|
|
||||||
// observers:
|
// observers:
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR int value() const BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR int value() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_val;
|
return val_;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR const error_category & category() const BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR const error_category & category() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return *m_cat;
|
return *cat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string message() const
|
std::string message() const
|
||||||
{
|
{
|
||||||
return m_cat->message( value() );
|
return cat_->message( value() );
|
||||||
}
|
}
|
||||||
|
|
||||||
char const * message( char * buffer, std::size_t len ) const BOOST_NOEXCEPT
|
char const * message( char * buffer, std::size_t len ) const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_cat->message( value(), buffer, len );
|
return cat_->message( value(), buffer, len );
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_SYSTEM_CONSTEXPR bool failed() const BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
|
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
|
||||||
{
|
{
|
||||||
return m_val != 0;
|
return failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -467,12 +507,12 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
|
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
|
||||||
{
|
{
|
||||||
return m_val == 0? 0 : unspecified_bool_true;
|
return failed_? unspecified_bool_true: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
|
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
|
||||||
{
|
{
|
||||||
return m_val == 0;
|
return !failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -483,12 +523,12 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR inline friend bool operator==( const error_condition & lhs, const error_condition & rhs ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR inline friend bool operator==( const error_condition & lhs, const error_condition & rhs ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return lhs.m_val == rhs.m_val && *lhs.m_cat == *rhs.m_cat;
|
return lhs.val_ == rhs.val_ && *lhs.cat_ == *rhs.cat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR inline friend bool operator<( const error_condition & lhs, const error_condition & rhs ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR inline friend bool operator<( const error_condition & lhs, const error_condition & rhs ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return *lhs.m_cat < *rhs.m_cat || ( *lhs.m_cat == *rhs.m_cat && lhs.m_val < rhs.m_val );
|
return *lhs.cat_ < *rhs.cat_ || ( *lhs.cat_ == *rhs.cat_ && lhs.val_ < rhs.val_ );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR)
|
#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR)
|
||||||
@ -514,18 +554,21 @@ class error_code
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int m_val;
|
int val_;
|
||||||
const error_category * m_cat;
|
bool failed_;
|
||||||
|
const error_category * cat_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// constructors:
|
// constructors:
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR error_code() BOOST_NOEXCEPT: m_val( 0 ), m_cat( &system_category() )
|
BOOST_SYSTEM_CONSTEXPR error_code() BOOST_NOEXCEPT:
|
||||||
|
val_( 0 ), failed_( false ), cat_( &system_category() )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR error_code( int val, const error_category & cat ) BOOST_NOEXCEPT: m_val( val ), m_cat( &cat )
|
BOOST_SYSTEM_CONSTEXPR error_code( int val, const error_category & cat ) BOOST_NOEXCEPT:
|
||||||
|
val_( val ), failed_( detail::failed_impl( val, cat ) ), cat_( &cat )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,8 +582,9 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR void assign( int val, const error_category & cat ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR void assign( int val, const error_category & cat ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
m_val = val;
|
val_ = val;
|
||||||
m_cat = &cat;
|
failed_ = detail::failed_impl( val, cat );
|
||||||
|
cat_ = &cat;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ErrorCodeEnum>
|
template<typename ErrorCodeEnum>
|
||||||
@ -553,42 +597,48 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR void clear() BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR void clear() BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
m_val = 0;
|
val_ = 0;
|
||||||
m_cat = &system_category();
|
failed_ = false;
|
||||||
|
cat_ = &system_category();
|
||||||
}
|
}
|
||||||
|
|
||||||
// observers:
|
// observers:
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR int value() const BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR int value() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_val;
|
return val_;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR const error_category & category() const BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR const error_category & category() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return *m_cat;
|
return *cat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_condition default_error_condition() const BOOST_NOEXCEPT
|
error_condition default_error_condition() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_cat->default_error_condition( value() );
|
return cat_->default_error_condition( value() );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string message() const
|
std::string message() const
|
||||||
{
|
{
|
||||||
return m_cat->message( value() );
|
return cat_->message( value() );
|
||||||
}
|
}
|
||||||
|
|
||||||
char const * message( char * buffer, std::size_t len ) const BOOST_NOEXCEPT
|
char const * message( char * buffer, std::size_t len ) const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_cat->message( value(), buffer, len );
|
return cat_->message( value(), buffer, len );
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_SYSTEM_CONSTEXPR bool failed() const BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
|
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
|
||||||
{
|
{
|
||||||
return m_val != 0;
|
return failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -598,12 +648,12 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
|
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
|
||||||
{
|
{
|
||||||
return m_val == 0? 0 : unspecified_bool_true;
|
return failed_? unspecified_bool_true: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
|
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
|
||||||
{
|
{
|
||||||
return m_val == 0;
|
return !failed_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -615,12 +665,12 @@ public:
|
|||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR inline friend bool operator==( const error_code & lhs, const error_code & rhs ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR inline friend bool operator==( const error_code & lhs, const error_code & rhs ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return lhs.m_val == rhs.m_val && *lhs.m_cat == *rhs.m_cat;
|
return lhs.val_ == rhs.val_ && *lhs.cat_ == *rhs.cat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_SYSTEM_CONSTEXPR inline friend bool operator<( const error_code & lhs, const error_code & rhs ) BOOST_NOEXCEPT
|
BOOST_SYSTEM_CONSTEXPR inline friend bool operator<( const error_code & lhs, const error_code & rhs ) BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
return *lhs.m_cat < *rhs.m_cat || ( *lhs.m_cat == *rhs.m_cat && lhs.m_val < rhs.m_val );
|
return *lhs.cat_ < *rhs.cat_ || ( *lhs.cat_ == *rhs.cat_ && lhs.val_ < rhs.val_ );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR)
|
#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR)
|
||||||
@ -816,6 +866,11 @@ inline char const * error_category::message( int ev, char * buffer, std::size_t
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool error_category::failed( int ev ) const BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return ev != 0;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace system
|
} // namespace system
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
@ -126,6 +126,9 @@ system-run win32_hresult_test.cpp ;
|
|||||||
system-run error_category_test.cpp ;
|
system-run error_category_test.cpp ;
|
||||||
system-run generic_category_test.cpp ;
|
system-run generic_category_test.cpp ;
|
||||||
system-run system_category_test.cpp ;
|
system-run system_category_test.cpp ;
|
||||||
|
system-run after_main_test.cpp ;
|
||||||
|
system-run failed_test.cpp ;
|
||||||
|
system-run- failed_constexpr_test.cpp ;
|
||||||
|
|
||||||
# Quick (CI) test
|
# Quick (CI) test
|
||||||
run quick.cpp ;
|
run quick.cpp ;
|
||||||
|
30
test/after_main_test.cpp
Normal file
30
test/after_main_test.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
// Copyright 2018 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
|
||||||
|
#include <boost/system/error_code.hpp>
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <boost/core/quick_exit.hpp>
|
||||||
|
#include <cerrno>
|
||||||
|
|
||||||
|
using namespace boost::system;
|
||||||
|
|
||||||
|
struct Z
|
||||||
|
{
|
||||||
|
~Z()
|
||||||
|
{
|
||||||
|
BOOST_TEST_CSTR_EQ( generic_category().name(), "generic" );
|
||||||
|
BOOST_TEST_CSTR_EQ( system_category().name(), "system" );
|
||||||
|
|
||||||
|
boost::quick_exit( boost::report_errors() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static Z z;
|
||||||
|
|
||||||
|
static error_code e1( 1, system_category() );
|
||||||
|
static error_code e2( ENOENT, generic_category() );
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
}
|
58
test/failed_constexpr_test.cpp
Normal file
58
test/failed_constexpr_test.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
|
||||||
|
// Copyright 2018 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
|
||||||
|
#include <boost/system/error_code.hpp>
|
||||||
|
#include <boost/config/pragma_message.hpp>
|
||||||
|
#include <boost/static_assert.hpp>
|
||||||
|
|
||||||
|
#if !defined(BOOST_SYSTEM_HAS_CONSTEXPR)
|
||||||
|
|
||||||
|
BOOST_PRAGMA_MESSAGE("Skipping constexpr test, BOOST_SYSTEM_HAS_CONSTEXPR isn't defined")
|
||||||
|
int main() {}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
using namespace boost::system;
|
||||||
|
|
||||||
|
constexpr error_code ec1( 1, system_category() );
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( ec1.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( ec1 );
|
||||||
|
BOOST_STATIC_ASSERT( !!ec1 );
|
||||||
|
|
||||||
|
constexpr error_code ec2( 2, generic_category() );
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( ec2.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( ec2 );
|
||||||
|
BOOST_STATIC_ASSERT( !!ec2 );
|
||||||
|
|
||||||
|
constexpr error_code ec3;
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( !ec3.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( ec3? false: true );
|
||||||
|
BOOST_STATIC_ASSERT( !ec3 );
|
||||||
|
|
||||||
|
constexpr error_condition en1( 1, system_category() );
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( en1.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( en1 );
|
||||||
|
BOOST_STATIC_ASSERT( !!en1 );
|
||||||
|
|
||||||
|
constexpr error_condition en2( 2, generic_category() );
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( en2.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( en2 );
|
||||||
|
BOOST_STATIC_ASSERT( !!en2 );
|
||||||
|
|
||||||
|
constexpr error_condition en3;
|
||||||
|
|
||||||
|
BOOST_STATIC_ASSERT( !en3.failed() );
|
||||||
|
BOOST_STATIC_ASSERT( en3? false: true );
|
||||||
|
BOOST_STATIC_ASSERT( !en3 );
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
185
test/failed_test.cpp
Normal file
185
test/failed_test.cpp
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
|
||||||
|
// Copyright 2018 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
|
||||||
|
// Avoid spurious VC++ warnings
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include <boost/system/error_code.hpp>
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
using namespace boost::system;
|
||||||
|
|
||||||
|
struct http_category_impl: public error_category
|
||||||
|
{
|
||||||
|
// clang++ 3.8 and below: initialization of const object
|
||||||
|
// requires a user-provided default constructor
|
||||||
|
BOOST_SYSTEM_CONSTEXPR http_category_impl() BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
char const * name() const BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return "http";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string message( int ev ) const
|
||||||
|
{
|
||||||
|
char buffer[ 32 ];
|
||||||
|
|
||||||
|
std::sprintf( buffer, "HTTP/1.0 %d", ev );
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool failed( int ev ) const BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
return !( ev >= 200 && ev < 300 );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
error_category const & http_category()
|
||||||
|
{
|
||||||
|
static const http_category_impl instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TEST_NOT_FAILED(ec) BOOST_TEST( !ec.failed() ); BOOST_TEST( ec? false: true ); BOOST_TEST( !ec );
|
||||||
|
#define TEST_FAILED(ec) BOOST_TEST( ec.failed() ); BOOST_TEST( ec ); BOOST_TEST( !!ec );
|
||||||
|
|
||||||
|
template<class Ec> void test()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Ec ec;
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 1, generic_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec.clear();
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec( 1, generic_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec();
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec;
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 1, system_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec.clear();
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec( 1, system_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec();
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec( 0, generic_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 1, system_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec( 0, system_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec( 1, generic_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 0, system_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec( 0, system_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 1, generic_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec( 0, generic_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec( 1, system_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 0, generic_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Ec ec( 0, http_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec.assign( 200, http_category() );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec = Ec( 404, http_category() );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
BOOST_TEST( !generic_category().failed( 0 ) );
|
||||||
|
BOOST_TEST( generic_category().failed( 7 ) );
|
||||||
|
|
||||||
|
BOOST_TEST( !system_category().failed( 0 ) );
|
||||||
|
BOOST_TEST( system_category().failed( 7 ) );
|
||||||
|
|
||||||
|
BOOST_TEST( http_category().failed( 0 ) );
|
||||||
|
BOOST_TEST( !http_category().failed( 200 ) );
|
||||||
|
BOOST_TEST( http_category().failed( 404 ) );
|
||||||
|
|
||||||
|
test<error_code>();
|
||||||
|
test<error_condition>();
|
||||||
|
|
||||||
|
{
|
||||||
|
error_condition ec( errc::success );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec = errc::address_family_not_supported;
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
error_condition ec( errc::address_family_not_supported );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = errc::success;
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
error_code ec( make_error_code( errc::success ) );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
|
||||||
|
ec = make_error_code( errc::address_family_not_supported );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
error_code ec( make_error_code( errc::address_family_not_supported ) );
|
||||||
|
TEST_FAILED( ec );
|
||||||
|
|
||||||
|
ec = make_error_code( errc::success );
|
||||||
|
TEST_NOT_FAILED( ec );
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
Reference in New Issue
Block a user