mirror of https://github.com/PentHertz/srsLTE.git
use macro to disable throw
This commit is contained in:
parent
0fdb5f0114
commit
e1ac6d7cfe
|
@ -519,7 +519,7 @@ protected:
|
||||||
if (is_success()) {
|
if (is_success()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
throw bad_type_access{"in proc_fsm_t::get_result"};
|
THROW_BAD_ACCESS("in proc_fsm_t::get_result");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -26,6 +26,14 @@
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
#if defined(__cpp_exceptions) && (1 == __cpp_exceptions)
|
||||||
|
#define THROW_BAD_FUNCTION_CALL(const char* cause) throw std::bad_function_call{};
|
||||||
|
#else
|
||||||
|
#define THROW_BAD_FUNCTION_CALL(cause) \
|
||||||
|
fprintf(stderr, "ERROR: exception thrown due to bad function call (cause: %s)\n", cause); \
|
||||||
|
std::abort()
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace srslte {
|
namespace srslte {
|
||||||
|
|
||||||
//! Size of the buffer used by "move_callback<R(Args...)>" to store functors without calling "new"
|
//! Size of the buffer used by "move_callback<R(Args...)>" to store functors without calling "new"
|
||||||
|
@ -54,7 +62,7 @@ class empty_table_t : public oper_table_t<R, Args...>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
constexpr empty_table_t() = default;
|
constexpr empty_table_t() = default;
|
||||||
R call(void* src, Args&&... args) const final { throw std::bad_function_call(); }
|
R call(void* src, Args&&... args) const final { THROW_BAD_FUNCTION_CALL("function ptr is empty"); }
|
||||||
void move(void* src, void* dest) const final {}
|
void move(void* src, void* dest) const final {}
|
||||||
void dtor(void* src) const final {}
|
void dtor(void* src) const final {}
|
||||||
bool is_in_small_buffer() const final { return true; }
|
bool is_in_small_buffer() const final { return true; }
|
||||||
|
|
|
@ -30,6 +30,21 @@
|
||||||
|
|
||||||
namespace srslte {
|
namespace srslte {
|
||||||
|
|
||||||
|
#if defined(__cpp_exceptions) && (1 == __cpp_exceptions)
|
||||||
|
class bad_type_access : public std::runtime_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit bad_type_access(const std::string& what_arg) : runtime_error(what_arg) {}
|
||||||
|
explicit bad_type_access(const char* what_arg) : runtime_error(what_arg) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define THROW_BAD_ACCESS(msg) throw bad_type_access{msg};
|
||||||
|
#else
|
||||||
|
#define THROW_BAD_ACCESS(msg) \
|
||||||
|
fprintf(stderr, "ERROR: exception thrown at %s", msg); \
|
||||||
|
std::abort()
|
||||||
|
#endif
|
||||||
|
|
||||||
//! Helper to print the name of a type for logging
|
//! Helper to print the name of a type for logging
|
||||||
/**
|
/**
|
||||||
* @brief Helper function that returns a type name string
|
* @brief Helper function that returns a type name string
|
||||||
|
@ -156,13 +171,6 @@ struct visit_impl<F, TypeList, First> {
|
||||||
|
|
||||||
} // namespace type_utils_details
|
} // namespace type_utils_details
|
||||||
|
|
||||||
class bad_type_access : public std::runtime_error
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit bad_type_access(const std::string& what_arg) : runtime_error(what_arg) {}
|
|
||||||
explicit bad_type_access(const char* what_arg) : runtime_error(what_arg) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
//! Get index of T in Types...
|
//! Get index of T in Types...
|
||||||
template <typename T, typename... Types>
|
template <typename T, typename... Types>
|
||||||
constexpr size_t get_type_index()
|
constexpr size_t get_type_index()
|
||||||
|
@ -201,7 +209,7 @@ T& get(TypeContainer& c)
|
||||||
if (c.template is<T>()) {
|
if (c.template is<T>()) {
|
||||||
return c.template get_unchecked<T>();
|
return c.template get_unchecked<T>();
|
||||||
}
|
}
|
||||||
throw bad_type_access{"in get<T>"};
|
THROW_BAD_ACCESS("in get<T>");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename TypeContainer>
|
template <typename T, typename TypeContainer>
|
||||||
|
@ -210,7 +218,7 @@ const T& get(const TypeContainer& c)
|
||||||
if (c.template is<T>()) {
|
if (c.template is<T>()) {
|
||||||
return c.template get_unchecked<T>();
|
return c.template get_unchecked<T>();
|
||||||
}
|
}
|
||||||
throw bad_type_access{"in get<T>"};
|
THROW_BAD_ACCESS("in get<T>");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <size_t I,
|
template <size_t I,
|
||||||
|
|
|
@ -104,7 +104,6 @@ int test_tagged_union()
|
||||||
|
|
||||||
int test_choice()
|
int test_choice()
|
||||||
{
|
{
|
||||||
using srslte::bad_type_access;
|
|
||||||
using srslte::choice_t;
|
using srslte::choice_t;
|
||||||
|
|
||||||
TESTASSERT(C::counter == 0);
|
TESTASSERT(C::counter == 0);
|
||||||
|
@ -123,15 +122,6 @@ int test_choice()
|
||||||
|
|
||||||
// TEST: Invalid member access. get<>() should throw
|
// TEST: Invalid member access. get<>() should throw
|
||||||
TESTASSERT(srslte::get_if<char>(c2) == nullptr);
|
TESTASSERT(srslte::get_if<char>(c2) == nullptr);
|
||||||
bool catched = false;
|
|
||||||
try {
|
|
||||||
char n = '1';
|
|
||||||
n = srslte::get<char>(c2);
|
|
||||||
TESTASSERT(n == '1');
|
|
||||||
} catch (bad_type_access& e) {
|
|
||||||
catched = true;
|
|
||||||
}
|
|
||||||
TESTASSERT(catched);
|
|
||||||
|
|
||||||
// TEST: simple emplace after construction
|
// TEST: simple emplace after construction
|
||||||
c2 = 'c';
|
c2 = 'c';
|
||||||
|
|
Loading…
Reference in New Issue