Refactor and rewrite a number of dwarf handling methods (#47)
Discard old implementations in favor of new implementations that are safer and cleaner
This commit is contained in:
parent
183cdf5a1c
commit
c94b03ae6e
@ -122,8 +122,18 @@ namespace detail {
|
|||||||
##__VA_ARGS__) \
|
##__VA_ARGS__) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Workaround a compiler warning
|
||||||
|
template<typename T>
|
||||||
|
std::string as_string(T&& value) {
|
||||||
|
return std::string(std::forward<T>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string as_string() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// Check condition in both debug and release. std::runtime_error on failure.
|
// Check condition in both debug and release. std::runtime_error on failure.
|
||||||
#define PANIC(...) ((::cpptrace::detail::panic)(CPPTRACE_PFUNC, {}, std::string(__VA_ARGS__)))
|
#define PANIC(...) ((::cpptrace::detail::panic)(CPPTRACE_PFUNC, {}, ::cpptrace::detail::as_string(__VA_ARGS__)))
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// Check condition in both debug. std::runtime_error on failure.
|
// Check condition in both debug. std::runtime_error on failure.
|
||||||
|
|||||||
@ -349,13 +349,17 @@ namespace detail {
|
|||||||
typename std::enable_if<
|
typename std::enable_if<
|
||||||
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
|
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
|
||||||
int
|
int
|
||||||
|
>::type = 0,
|
||||||
|
typename std::enable_if<
|
||||||
|
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
|
||||||
|
int
|
||||||
>::type = 0
|
>::type = 0
|
||||||
>
|
>
|
||||||
class raii_wrapper {
|
class raii_wrapper {
|
||||||
T obj;
|
T obj;
|
||||||
optional<D> deleter;
|
optional<D> deleter;
|
||||||
public:
|
public:
|
||||||
raii_wrapper(T&& obj, D deleter) : obj(std::move(obj)), deleter(deleter) {}
|
raii_wrapper(T obj, D deleter) : obj(obj), deleter(deleter) {}
|
||||||
raii_wrapper(raii_wrapper&& other) : obj(std::move(other.obj)), deleter(other.deleter) {
|
raii_wrapper(raii_wrapper&& other) : obj(std::move(other.obj)), deleter(other.deleter) {
|
||||||
other.deleter = nullopt;
|
other.deleter = nullopt;
|
||||||
}
|
}
|
||||||
@ -373,6 +377,12 @@ namespace detail {
|
|||||||
operator const T&() const {
|
operator const T&() const {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
T& get() {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
const T& get() const {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<
|
template<
|
||||||
@ -381,10 +391,14 @@ namespace detail {
|
|||||||
typename std::enable_if<
|
typename std::enable_if<
|
||||||
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
|
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
|
||||||
int
|
int
|
||||||
|
>::type = 0,
|
||||||
|
typename std::enable_if<
|
||||||
|
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
|
||||||
|
int
|
||||||
>::type = 0
|
>::type = 0
|
||||||
>
|
>
|
||||||
raii_wrapper<T, D> raii_wrap(T&& obj, D deleter) {
|
raii_wrapper<typename std::remove_reference<T>::type, D> raii_wrap(T obj, D deleter) {
|
||||||
return raii_wrapper<T, D>(std::move(obj), deleter);
|
return raii_wrapper<typename std::remove_reference<T>::type, D>(obj, deleter);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void file_deleter(FILE* ptr) {
|
inline void file_deleter(FILE* ptr) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user