mirror of
https://github.com/microsoft/GSL.git
synced 2024-11-03 17:56:43 -05:00
Enable usage of gsl::narrow with exceptions disabled
This solution uses the approach of boost::asio to enabling usage of the library in environments where exception usage is either prohibited or not feasible (due to code size constraints). A function template gsl::throw_exception has been added, which in a normal environment just throws the exception. However, when GSL_TERMINATE_ON_CONTRACT_VIOLATION is defined the function is only declared by gsl and the definition of this function template must be supplied by the library's user. Closes: #468 Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
This commit is contained in:
parent
1f87ef73f1
commit
fbfdacb45f
@ -72,19 +72,55 @@ struct fail_fast : public std::logic_error
|
||||
{
|
||||
explicit fail_fast(char const* const message) : std::logic_error(message) {}
|
||||
};
|
||||
}
|
||||
namespace details
|
||||
{
|
||||
template <typename Exception>
|
||||
[[noreturn]] void throw_exception(Exception&& exception);
|
||||
|
||||
} //namespace details
|
||||
} //namespace gsl
|
||||
|
||||
#if defined(GSL_THROW_ON_CONTRACT_VIOLATION)
|
||||
|
||||
namespace gsl
|
||||
{
|
||||
namespace details
|
||||
{
|
||||
template <typename Exception>
|
||||
[[noreturn]] void throw_exception(Exception&& exception)
|
||||
{
|
||||
throw exception;
|
||||
}
|
||||
|
||||
} //namespace details
|
||||
} //namespace gsl
|
||||
|
||||
#define GSL_CONTRACT_CHECK(type, cond) \
|
||||
(GSL_LIKELY(cond) ? static_cast<void>(0) \
|
||||
: throw gsl::fail_fast("GSL: " type " failure at " __FILE__ \
|
||||
": " GSL_STRINGIFY(__LINE__)))
|
||||
: gsl::throw_exception(gsl::fail_fast("GSL: " type " failure at " __FILE__ \
|
||||
": " GSL_STRINGIFY(__LINE__))))
|
||||
|
||||
#elif defined(GSL_TERMINATE_ON_CONTRACT_VIOLATION)
|
||||
|
||||
#define GSL_CONTRACT_CHECK(type, cond) (GSL_LIKELY(cond) ? static_cast<void>(0) : std::terminate())
|
||||
|
||||
namespace gsl
|
||||
{
|
||||
namespace details
|
||||
{
|
||||
template <typename Exception>
|
||||
[[noreturn]] void throw_exception(Exception&& exception)
|
||||
{
|
||||
static_cast<void>(exception);
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
} //namespace details
|
||||
} //namespace gsl
|
||||
|
||||
#define GSL_CONTRACT_CHECK(type, cond) \
|
||||
(GSL_LIKELY(cond) ? static_cast<void>(0) : std::terminate())
|
||||
|
||||
#elif defined(GSL_UNENFORCED_ON_CONTRACT_VIOLATION)
|
||||
|
||||
#define GSL_CONTRACT_CHECK(type, cond) GSL_ASSUME(cond)
|
||||
|
@ -121,9 +121,9 @@ template <class T, class U>
|
||||
inline T narrow(U u)
|
||||
{
|
||||
T t = narrow_cast<T>(u);
|
||||
if (static_cast<U>(t) != u) throw narrowing_error();
|
||||
if (static_cast<U>(t) != u) gsl::details::throw_exception(narrowing_error());
|
||||
if (!details::is_same_signedness<T, U>::value && ((t < T{}) != (u < U{})))
|
||||
throw narrowing_error();
|
||||
gsl::details::throw_exception(narrowing_error());
|
||||
return t;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user