0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-17 15:30:52 +01:00

ircd::util: Add unwind utils that assert whether exception is taking place.

This commit is contained in:
Jason Volk 2018-03-14 20:21:51 -07:00
parent ffafb70511
commit 6dc834b9c9

View file

@ -49,6 +49,8 @@ struct ircd::util::unwind
/// ///
struct ircd::util::unwind::nominal struct ircd::util::unwind::nominal
{ {
struct assertion;
const std::function<void ()> func; const std::function<void ()> func;
template<class F> template<class F>
@ -74,6 +76,8 @@ struct ircd::util::unwind::nominal
/// ///
struct ircd::util::unwind::exceptional struct ircd::util::unwind::exceptional
{ {
struct assertion;
const std::function<void ()> func; const std::function<void ()> func;
template<class F> template<class F>
@ -89,3 +93,28 @@ struct ircd::util::unwind::exceptional
exceptional(const exceptional &) = delete; exceptional(const exceptional &) = delete;
}; };
/// Asserts that unwind is occurring without any exception. This allows some
/// section of code, for example, the latter half of a function, to assert that
/// it is not throwing and disrupting the other half. This is useful when no
/// exception is expected thus placing other guarantees should not be required
/// if this guarantee is met.
///
struct ircd::util::unwind::nominal::assertion
{
~assertion() noexcept
{
assert(likely(!std::uncaught_exception()));
}
};
/// Complements exceptional::assertion. This triggers an assertion when
/// unwinding WITHOUT an exception.
///
struct ircd::util::unwind::exceptional::assertion
{
~assertion() noexcept
{
assert(likely(std::uncaught_exception()));
}
};