mapbox/variant: Implement std::get_if interface
Some of the code in the openbmc project uses their own ad-hoc get_if
style interface. We need to provide one on the mapbox side to ease the
transition.
Tested:
Built code against the get_if implementation to make sure it
conforms to the same behavior as std::get_if.
Change-Id: I8560a2d13110ab7fd82a21835a5e233682003fa8
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/mapbox/variant.hpp b/mapbox/variant.hpp
index 7c02032..ea980b3 100644
--- a/mapbox/variant.hpp
+++ b/mapbox/variant.hpp
@@ -1113,6 +1113,16 @@
return var.template get_unchecked<ResultType>();
}
+template <typename ResultType, typename... Types>
+std::add_pointer_t<ResultType> get_if(variant<Types...>* v)
+{
+ if (v == nullptr || !v->template is<ResultType>())
+ {
+ return nullptr;
+ }
+ return &v->template get_unchecked<ResultType>();
+}
+
#ifdef HAS_EXCEPTIONS
template <typename ResultType, typename T>
auto get(T const& var) -> decltype(var.template get<ResultType>())
@@ -1126,6 +1136,17 @@
{
return var.template get_unchecked<ResultType>();
}
+
+template <typename ResultType, typename... Types>
+std::add_pointer_t<const ResultType> get_if(const variant<Types...>* v)
+{
+ if (v == nullptr || !v->template is<ResultType>())
+ {
+ return nullptr;
+ }
+ return &v->template get_unchecked<ResultType>();
+}
+
} // namespace util
} // namespace mapbox