Commit e7805402 authored by Matthias Vallentin's avatar Matthias Vallentin

Make optional<T> inspectable

(via @Neverlord)
parent a7b5c235
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "caf/config.hpp" #include "caf/config.hpp"
#include "caf/detail/safe_equal.hpp" #include "caf/detail/safe_equal.hpp"
#include "caf/detail/scope_guard.hpp"
namespace caf { namespace caf {
...@@ -230,6 +231,8 @@ class optional<T&> { ...@@ -230,6 +231,8 @@ class optional<T&> {
template <> template <>
class optional<void> { class optional<void> {
public: public:
using type = unit_t;
optional(none_t = none) : m_value(false) { optional(none_t = none) : m_value(false) {
// nop // nop
} }
...@@ -254,6 +257,41 @@ class optional<void> { ...@@ -254,6 +257,41 @@ class optional<void> {
bool m_value; bool m_value;
}; };
template <class Inspector, class T>
typename std::enable_if<Inspector::is_saving::value,
typename Inspector::result_type>::type
inspect(Inspector& f, optional<T>& x) {
return x ? f(false) : f(true, *x);
}
template <class T>
struct optional_inspect_helper {
bool& enabled;
T& storage;
template <class Inspector>
friend typename Inspector::result_type inspect(Inspector& f,
optional_inspect_helper& x) {
return x.enabled ? f(x.storage) : f();
}
};
template <class Inspector, class T>
typename std::enable_if<Inspector::is_loading::value,
typename Inspector::result_type>::type
inspect(Inspector& f, optional<T>& x) {
bool flag;
typename optional<T>::type tmp;
optional_inspect_helper<T> helper{flag, tmp};
auto guard = detail::make_scope_guard([&] {
if (flag)
x = std::move(tmp);
else
x = none;
});
return f(flag, helper);
}
/// @relates optional /// @relates optional
template <class T> template <class T>
auto to_string(const optional<T>& x) -> decltype(to_string(*x)) { auto to_string(const optional<T>& x) -> decltype(to_string(*x)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment