Elements 6.3.3
A C++ base framework for the Euclid Software.
Loading...
Searching...
No Matches
Exception.tpp
Go to the documentation of this file.
1
20
21// IWYU pragma: private, include "ElementsKernel/Exception.h"
22
23#ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_EXCEPTION_IMPL_
24#error "This file should not be included directly! Use ElementsKernel/Exception.h instead"
25#else
26
27#include <cstdio> // for snprintf, size_t
28#include <sstream> // for basic_ostream, stringstream
29#include <string> // for char_traits, allocator, operator<<, string
30#include <type_traits> // for enable_if, is_same
31#include <utility> // for forward
32
33#include "ElementsKernel/Exit.h" // for ExitCode
34
35namespace Elements {
36
37template <typename... Args>
38Exception::Exception(const char* string_format, Args&&... args) : m_exit_code{ExitCodeHelper<Args...>{args...}.code} {
39 std::size_t len = snprintf(nullptr, 0, string_format, std::forward<Args>(args)...) + 1;
40 char* message = new char[len];
41 snprintf(message, len, string_format, std::forward<Args>(args)...);
42 m_error_msg = std::string(message);
43 delete[] message;
44}
45
46template <typename T>
47void Exception::appendMessage(const T& message) {
48 std::stringstream new_message;
49 new_message << m_error_msg << message;
50 m_error_msg = new_message.str();
51}
52
53template <typename Last>
54Exception::ExitCodeHelper<Last>::ExitCodeHelper(const Last& last) : code{getCode(last)} {}
55
56template <typename Last>
57template <typename T, typename std::enable_if<std::is_same<T, ExitCode>::value>::type*>
58ExitCode Exception::ExitCodeHelper<Last>::getCode(const T& t) {
59 return t;
60}
61
62template <typename Last>
63template <typename T, typename std::enable_if<not std::is_same<T, ExitCode>::value>::type*>
64ExitCode Exception::ExitCodeHelper<Last>::getCode(const T&) {
65 return ExitCode::NOT_OK;
66}
67
68template <typename First, typename... Rest>
69Exception::ExitCodeHelper<First, Rest...>::ExitCodeHelper(const First&, const Rest&... rest)
70 : Exception::ExitCodeHelper<Rest...>::template ExitCodeHelper<Rest...>(rest...) {}
71
72template <typename Ex, typename T, typename>
73auto operator<<(Ex&& ex, const T& message) -> decltype(std::forward<Ex>(ex)) {
74 ex.appendMessage(message);
75 return std::forward<Ex>(ex);
76}
77
78} // namespace Elements
79
80#endif // ELEMENTSKERNEL_ELEMENTSKERNEL_AUXILIARY_IMPL_
define a list of standard exit codes for executables
Exception(ExitCode e=ExitCode::NOT_OK)
Definition Exception.cpp:27
T forward(T... args)
T snprintf(T... args)
ExitCode
Strongly typed exit numbers.
Definition Exit.h:97
ELEMENTS_API std::ostream & operator<<(std::ostream &, const Environment::Variable &)
T str(T... args)