26 #ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_EXCEPTION_H_
27 #define ELEMENTSKERNEL_ELEMENTSKERNEL_EXCEPTION_H_
34 #include <type_traits>
66 m_error_msg(message), m_exit_code{
e} {
75 m_error_msg(message), m_exit_code{
e} {
84 template <
typename ...Args>
85 explicit Exception(
const char* stringFormat, Args &&...args)
87 size_t len = snprintf(NULL, 0, stringFormat, std::forward<Args>(args)...)+1;
88 char* message =
new char[len];
89 snprintf(message, len, stringFormat, std::forward<Args>(args)...);
103 const
char * what() const noexcept
override {
104 return m_error_msg.c_str();
122 template <
typename T>
125 new_message << m_error_msg << message;
126 m_error_msg = new_message.
str();
140 template<
typename... Args>
144 template<
typename Last>
150 template<typename T, typename std::enable_if<std::is_same<T, ExitCode>::value>::type* =
nullptr>
155 template<typename T, typename std::enable_if<not std::is_same<T, ExitCode>::value>::type* =
nullptr>
157 return ExitCode::NOT_OK;
162 template<
typename First,
typename... Rest>
169 template <
typename Ex,
typename T,
172 auto operator<<(Ex&& ex,
const T& message) -> decltype(std::forward<Ex>(ex)) {
173 ex.appendMessage(message);
174 return std::forward<Ex>(ex);
179 #endif // ELEMENTSKERNEL_ELEMENTSKERNEL_EXCEPTION_H_