2
0
mirror of https://github.com/boostorg/leaf.git synced 2026-02-09 11:12:37 +00:00

is_error_type, renamed peek_next_error to next_error_value

This commit is contained in:
Emil Dotchevski
2018-11-25 12:37:27 -08:00
parent bb54d9d19d
commit 1bac1e1d1a
16 changed files with 204 additions and 48 deletions

View File

@@ -10,7 +10,7 @@
#include <boost/leaf/common.hpp>
#include <exception>
#define LEAF_THROW ::boost::leaf::peek_next_error().propagate(::boost::leaf::e_source_location{__FILE__,__LINE__,__FUNCTION__}),throw::boost::leaf::exception
#define LEAF_THROW ::boost::leaf::next_error_value().propagate(::boost::leaf::e_source_location{__FILE__,__LINE__,__FUNCTION__}),throw::boost::leaf::exception
namespace boost { namespace leaf {

View File

@@ -12,8 +12,12 @@
#include <cstdio>
#include <climits>
#include <ostream>
#include <type_traits>
#include <system_error>
#define LEAF_ERROR ::boost::leaf::peek_next_error().propagate(::boost::leaf::e_source_location{__FILE__,__LINE__,__FUNCTION__}),::boost::leaf::error
#define LEAF_ERROR ::boost::leaf::next_error_value().propagate(::boost::leaf::e_source_location{__FILE__,__LINE__,__FUNCTION__}),::boost::leaf::error
namespace boost { namespace system { class error_code; } }
namespace boost { namespace leaf {
@@ -29,15 +33,40 @@ namespace boost { namespace leaf {
}
};
namespace leaf_detail
{
template <class T, class E = void>
struct has_data_member_value
{
static constexpr bool value=false;
};
template <class T>
struct has_data_member_value<T, decltype(std::declval<T const &>().value, void())>
{
static constexpr bool value=std::is_member_object_pointer<decltype(&T::value)>::value;
};
}
template <class T>
struct is_error_type
{
static constexpr bool value = leaf_detail::has_data_member_value<T>::value;
};
template <> struct is_error_type<system::error_code>: std::true_type { };
template <> struct is_error_type<std::error_code>: std::true_type { };
template <> struct is_error_type<e_source_location>: std::true_type { };
////////////////////////////////////////
class error;
error peek_next_error() noexcept;
error next_error_value() noexcept;
class error
{
friend error leaf::peek_next_error() noexcept;
friend error leaf::next_error_value() noexcept;
unsigned id_;
@@ -119,7 +148,7 @@ namespace boost { namespace leaf {
return os;
}
static error peek_next_error() noexcept
static error next_error_value() noexcept
{
return error(id_factory::tl_instance().peek());
}
@@ -128,7 +157,7 @@ namespace boost { namespace leaf {
error propagate( E && ... ) const noexcept;
};
inline error peek_next_error() noexcept
inline error next_error_value() noexcept
{
return error(error::id_factory::tl_instance().peek());
}
@@ -153,6 +182,7 @@ namespace boost { namespace leaf {
slot & operator=( slot const & ) = delete;
typedef optional<error_info<E>> base;
slot<E> * prev_;
static_assert(is_error_type<E>::value,"All types passed to leaf::expect must be error types");
public:
slot() noexcept;
~slot() noexcept;

View File

@@ -17,7 +17,7 @@ namespace boost { namespace leaf {
if( auto e = dynamic_cast<error const *>(&ex) )
return *e;
else
return peek_next_error();
return next_error_value();
}
template <class P, class... E>

View File

@@ -37,7 +37,7 @@ namespace boost { namespace leaf {
{
if( !has_error_ )
{
set_error(peek_next_error());
set_error(next_error_value());
has_error_ = true;
}
unload();

View File

@@ -66,7 +66,7 @@ namespace boost { namespace leaf {
explicit preloaded( E && ... e ) noexcept:
p_(preloaded_item<E>(std::forward<E>(e))...),
e_(peek_next_error()),
e_(next_error_value()),
moved_(false)
{
}
@@ -81,7 +81,7 @@ namespace boost { namespace leaf {
~preloaded() noexcept
{
if( !moved_ && (e_!=peek_next_error() || std::uncaught_exception()) )
if( !moved_ && (e_!=next_error_value() || std::uncaught_exception()) )
leaf_detail::tuple_for_each_preload<sizeof...(E),decltype(p_)>::trigger(p_,e_);
}
};
@@ -131,7 +131,7 @@ namespace boost { namespace leaf {
explicit deferred( F && ... f ) noexcept:
d_(deferred_item<F>(std::forward<F>(f))...),
e_(peek_next_error()),
e_(next_error_value()),
moved_(false)
{
}
@@ -146,7 +146,7 @@ namespace boost { namespace leaf {
~deferred() noexcept
{
if( !moved_ && (e_!=peek_next_error() || std::uncaught_exception()) )
if( !moved_ && (e_!=next_error_value() || std::uncaught_exception()) )
leaf_detail::tuple_for_each_preload<sizeof...(F),decltype(d_)>::trigger(d_,e_);
}
};